带有BroadcastReceiver内部类的Android AlarmManager

时间:2014-04-14 03:27:03

标签: android broadcastreceiver alarmmanager

我正在尝试使用内部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);

警报不会给我开火。

4 个答案:

答案 0 :(得分:1)

据我所知,您不能将LocalBroadcastReceiverAlarmManager一起使用,因为对于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)

文档:IntentService

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();
 }