当BroadcastReceiver是内部类时,为什么不调用BroadcastReceiver的onReceive?

时间:2014-05-10 07:51:42

标签: android broadcastreceiver inner-classes

当我在其自己的文件中有下面的AlarmReceiver类时,将记录日志语句并调用onReceive方法。我需要让我的BroadcastReceiver成为一个内部类,所以我可以从我的Activity中调用getFragmentManager()。但是,当我将它作为我的主Activity类的内部类时,它不会被调用。那是为什么?

 public class MainActivity extends Activity {

        public class AlarmReceiver extends BroadcastReceiver { //this needs to be an inner class to access the activity

            @Override
            public void onReceive(Context arg0, Intent arg1) {
                Log.d("BROADCAST","RECEIVED");
                //start a new activity, an alarm has gone off
                AlarmFragment alarmFragment=new AlarmFragment();  
              // getFragmentManager().beginTransaction().replace(R.id.container, alarmFragment).commit();

            }
        }

public void setAlarm(){
   Intent intentAlarm = new Intent(this, AlarmReceiver.class);

   //Get the Alarm Service
   AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

   Long currentTime = new GregorianCalendar().getTimeInMillis();

   //DEBUG TIME
   alarmManager.set(AlarmManager.RTC_WAKEUP,currentTime+7500,PendingIntent.getBroadcast(this,1,  intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}

}

2 个答案:

答案 0 :(得分:-1)

  

为什么?

你有关于如何发送和接收广播机制的重大根本错误:

您向警报管理员提供PendingIntent以开始广播,但在实践中 - 您提供意图而不指定任何操作。

在没有动作的情况下发送广播毫无意义!!!

您应该在intentAlarm对象中添加一个标识广播的自定义操作字符串,并以编程方式向您的AlarmReceiver接收者注册处理此自定义操作的IntentFilter:

 Intent intentAlarm = new Intent(CUSTOM_ACTION_STRING);
 ....
 ....

(你应该保留对AlarmReceiver类的一个实例的引用。那就是mAlarmReceiver ...) 添加到广播的活动onResume()回调注册:

 @Override
public void onResume() {
    super.onResume();

    registerReceiver(mAlarmReceiver , new IntentFilter(CUSTOM_ACTION_STRING));
}

不要忘记取消注册接收者:

@Override
public void onPause() {
    unregisterReceiver(mAlaramReceiver);

    super.onPause();
}

答案 1 :(得分:-1)

请将您的活动类更改为FragmentActivity,并使用上下文对象进行访问,如下面的代码所示。

arg0.getFragmentManager().beginTransaction().replace(R.id.container, alarmFragment).commit();

这是一个尝试。请告诉我您的反馈意见。