在服务中注册broadcastReceiver

时间:2013-12-17 07:06:45

标签: android

我的应用程序有问题,它从服务器获取数据并决定何时提醒,我在服务中意识到这一点时出错了,因为在睡眠模式服务停止时,我需要将其替换为Alarm但我有很多服务中的变量并将它们发送到AlarmReceiver类是有问题的,我读到了内部类但我无法在清单中注册它只能是静态的,我试着使用寄存器接收器但是它不起作用我做错了吗?

public  class AlarmReceiver extends BroadcastReceiver {
    private String text;

    @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();
        Autobus66Service.UpdatePassages();
        wl.release();
    }

    public void SetAlarm(Context context,String text){
        this.text = text;
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, AlarmReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 30 * 1, pi);
    }

    public void CancelAlarm(Context context)
    {
        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}


@Override
public void onCreate() {

    Log.d("service onCreate", MainActivity.TAG);
    handler = new Handler();
    intent = new Intent(AppNames.BROADCAST_ACTION);
    ...

    alarm = new AlarmReceiver();
    IntentFilter filter= new IntentFilter();
    registerReceiver(alarm,filter);

}


@Override
public void onStart(Intent intent, int startId) {
    Log.d("service onStart", MainActivity.TAG);

    handler.removeCallbacks(sendUpdatesToUI);
    handler.postDelayed(sendUpdatesToUI, 1000);
    createNotification();
    alarm.SetAlarm(this,"Some text");

}

在AndroidManifest中看起来像:

  <receiver android:process=":remote" android:name="com.autobus66.autobus66.service.Autobus66Service$AlarmReceiver">

    </receiver>

1 个答案:

答案 0 :(得分:0)

它可能只是

public static class AlarmReceiver

我相信它应该被引用为

android:name="com.autobus66.autobus66.service.Autobus66Service.AlarmReceiver"

static 因为内部类的实例具有对包含类的包含实例的隐式引用。您不能在包含类的实例方法之外创建内部类的非静态实例,因为java需要指向包含该类的实例的指针。

这意味着您必须找到一些方法来保持应用程序的状态。另请注意,可能会终止并重新启动任何进程(包括服务和活动),并且应编写应用程序以便终止进程不会导致数据丢失。 (我不是说它很好,我说是这样。)