如下图BroadcastReceiver是在service中启动的,用进程查杀把Activity杀了,但是service还在。此时,执行到RemindReceiver 时,就会报错。求解释
package sdnote.note;import sdnote.note.vo.Matter;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;public class RemindReceiver extends BroadcastReceiver
{ @Override
public void onReceive(Context context, Intent intent)
{
int index = intent.getExtras().getInt("index");
Matter m = NoteModel.getInstance().matters.get(index); NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, m.title != null ? m.title : m.content, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, SDNoteActivity.class), 0);
notification.setLatestEventInfo(context, m.title, m.content, contentIntent);
manager.notify(R.drawable.icon, notification); Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(new long[] { 50, 2000, 50, 2000 }, -1);
}
}

解决方案 »

  1.   

    Activity杀死时,有没有取消receive注册
      

  2.   

    BroadcastReceiver 注册分两种,
    第一种是静态注册,也就是在manifest.xml文件中注册,
    另外一种是在程序中注册,如果你是在程序中动态注册的话,activity结束时,一定要反注册(unregister),要不然,程序会出现问题。我怀疑你用的是动态注册,而且没有反注册。
      

  3.   


    我晚上写个完整的DEMO好了
      

  4.   

    Service还在,是不是被杀掉又起来了,在onDestroy里log一下看看吧
      

  5.   


    借LZ的帖子,看了3楼的回复,我也有个疑问:在activity中动态注册的广播,在退出activity的时候必须要注销广播才行吗?那如果我要实现一个接受系统广播的BroadcastReceiver,可我又不想静态注册(静态注册在程序一安装的时候就注册了吧,而且要卸载程序才能注销),我想在程序中动态注册,这个程序就相当于我自己随时能设置BroadcastReceiver一样,当然这个设置要能够保存。我肯定希望退出程序也不注销BroadcastReceiver,在我不希望接收这个系统广播的时候我再启动程序来注销它,要这样的话,怎么实现呢?
      

  6.   


    希望的情况是“activity杀了,service还在,能触发BroadcastReceiver,并且发出Notification”现在的情况是“activity杀了,service还在,也能触发BroadcastReceiver,但是无法发出Notification”