来自BroadcastReceiver的startActivity()

我正尝试使用onPause()方法中实现的以下BroadcastReceiver自动启动我的夜钟应用程序充电:

BroadcastReceiver test = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { unregisterReceiver(this); Intent i = new Intent(context, NightClock.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } }; registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

当USB电缆插入时会触发onReceive()方法,但活动不会启动。 但是日志显示这个:

 I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

任何想法为什么日志说活动开始,但没有任何反应?

如果你的目标是你希望每当发送一个ACTION_POWER_CONNECTED广播时启动NightClock ,你使用BroadcastReceiver就没有问题。 但是,不要从活动注册。 而是将其注册在清单中:

 <receiver android:name=".OnPowerReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> </intent-filter> </receiver> 

然后,把你的BroadcastReceiver作为一个公共的Java类(这里叫做OnPowerReceiver ,尽pipe你可以调用它),然后让它调用startActivity()

请记住,用户可能不希望你这样做。 除了启动“夜钟”之外,还有许多其他情况可以将手机连接到电源。 我虚心地build议你让用户通过主屏幕开始你的活动。

你有上下文作为parameter passing给onRecieve()方法,所以只需使用:

  @Override public void onReceive(Context context, Intent intent) { //start activity Intent i = new Intent(); i.setClassName("com.test", "com.test.MainActivity"); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } 

它的工作原理,当然你必须改变包和活动类名称为你自己的。

从文档 :

不要从广播接收机开始活动,因为用户体验震撼; 特别是如果有多个接收器的话。 相反,请考虑显示通知。