来自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); }
它的工作原理,当然你必须改变包和活动类名称为你自己的。
从文档 :
不要从广播接收机开始活动,因为用户体验震撼; 特别是如果有多个接收器的话。 相反,请考虑显示通知。