警报管理器示例
2022-08-31 04:43:12
我想在我的项目中实现一个计划函数。所以我在谷歌上搜索了一个警报管理器程序,但我找不到任何例子。
任何人都可以帮助我一个基本的报警管理器程序吗?
我想在我的项目中实现一个计划函数。所以我在谷歌上搜索了一个警报管理器程序,但我找不到任何例子。
任何人都可以帮助我一个基本的报警管理器程序吗?
这是工作代码。它每 10 分钟唤醒一次 CPU,直到手机关闭。
添加到清单.xml:
...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver android:process=":remote" android:name=".Alarm"></receiver>
...
类中的代码:
package yourPackage;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;
public class Alarm extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
wl.release();
}
public void setAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
}
public void cancelAlarm(Context context)
{
Intent intent = new Intent(context, Alarm.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
从服务设置警报:
package yourPackage;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
public class YourService extends Service
{
Alarm alarm = new Alarm();
public void onCreate()
{
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
alarm.setAlarm(this);
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startId)
{
alarm.setAlarm(this);
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
}
如果要在手机启动时设置警报重复:
将权限和服务添加到清单.xml:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver android:name=".AutoStart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
...
<service
android:name=".YourService"
android:enabled="true"
android:process=":your_service" >
</service>
并创建一个新类:
package yourPackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AutoStart extends BroadcastReceiver
{
Alarm alarm = new Alarm();
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
{
alarm.setAlarm(context);
}
}
}
我尝试了XXX的解决方案,虽然它最初确实有效,但在某些时候它停止工作。再也没有被叫到。我花了几个小时试图弄清楚它可能是什么。我意識到的是,無論出於什麼神秘的原因,都不再被稱呼。为了解决这个问题,我发现您确实需要在清单中为接收方指定操作。例:onReceive
Intent
<receiver android:name=".Alarm" android:exported="true">
<intent-filter>
<action android:name="mypackage.START_ALARM" >
</action>
</intent-filter>
</receiver>
请注意,名称与句点一起。在 XXX 的方法中,按如下方式创建:".Alarm"
setAlarm
Intent
Intent i = new Intent("mypackage.START_ALARM");
消息可以是您想要的任何内容。我只是为了给它起这个名字来演示。START_ALARM
我还没有看到清单中定义的接收器没有指定操作的意图过滤器。以XXX指定的方式创建它们似乎有点虚假。通过指定操作名称,Android 将被迫创建与操作对应的 using 类的实例。如果您依赖上下文,请注意,Android 有几个不同的对象,这些对象都称为上下文,可能不会导致您创建的对象。强制 Android 仅使用操作消息创建类的实例,远比依赖一些可能永远不起作用的上下文要好得多。BroadcastReceiver
BroadcastReceiver