我正在尝试使用内部BroadcastReceiver类实现AlarmManager。这是我的内心课程:
public class MyAlarm extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "alarm worked", Toast.LENGTH_SHORT).show();
}
public void setAlarm(Context context) {
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyAlarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10000, pi);
}
}
由于它是一个内部类,我明白我必须动态注册接收器。在我的主要活动中,我有以下代码:
IntentFilter filter = new IntentFilter();
MyAlarm alarm = new MyAlarm();
alarm.setAlarm(this);
this.registerReceiver(alarm, filter);
警报不会给我开火。
答案 0 :(得分:1)
据我所知,您不能将LocalBroadcastReceiver
与AlarmManager
一起使用,因为对于localBroadcast,数据不会离开应用程序,它可以在应用程序进程(本地)中运行,并且警报管理器可以处理不同的进程。
实际上,未决意图将是“问题”:
PendingIntent类提供了一种创建意图的机制 可以由另一个应用程序代表您的应用程序触发 晚些时候
正如您所看到的,pendingIntent可以使用不同的进程。这就是你无法使用本地广播的原因。
你需要在清单中注册接收者,正如@leesei所说,你必须将内部类声明为static
。
答案 1 :(得分:0)
不知道项目的细节,我倾向于说当你的活动在前台时,不要使用接收器,使用Handler并发布延迟的runnable。
private static final long DELAY = 10000;
private Handler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler();
}
protected void onStart() {
handler.postDelayed(doSomethingRunnable, DELAY);
}
protected void onStop() {
handler.removeCallbacks(doSomethingRunnable);
}
private Runnable doSomethingRunnable = new Runnable() {
@Override
public void run() {
doSomething(); // the method you wanted to call
handler.postDelayed(this, DELAY);
}
}
答案 2 :(得分:0)
public class MyService extends IntentService() {
private static final String TAG = "MyService"
public MyService() {
super(TAG);
}
@Override
public void onHandleIntent(Intent intent) {
// do your work here
}
}
在其他地方,可能在您的活动中,您将创建一个警报以定期运行您的服务:
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyAlarm.class);
PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10000, pi);
我不确定你的用例是什么,但是每十秒一次似乎有点激进。您可能需要考虑更长的间隔。
答案 3 :(得分:0)
在Broadcastreceiver-
的onreceive方法中使用此代码 @Override
public void onReceive(Context context, Intent intent)
{
//you need to acquire the power lock
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "YOUR TAG");
wl.acquire();
//do you things
//then release the lock
wl.release();
}