我正在尝试使用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 }
为什么日志说活动已经开始,但没有任何反应?
答案 0 :(得分:54)
您将上下文作为参数传递给onReceive()方法,因此只需使用:
@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);
}
当然,您必须将包和活动类名称更改为您自己的名称。
答案 1 :(得分:19)
如果您希望在发送NightClock
广播时启动ACTION_POWER_CONNECTED
,那么您使用BroadcastReceiver
的方法就可以了。但是,请勿从活动中注册。而是在清单中注册它:
<receiver android:name=".OnPowerReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
</intent-filter>
</receiver>
然后,将您的BroadcastReceiver
作为公共Java类(此处命名为OnPowerReceiver
,尽管您可以随意调用它),然后调用startActivity()
。
请记住,用户可能不希望您这样做。除了启动“夜钟”之外,还有许多其他情况可以将手机连接到电源。我谦卑地建议你让用户通过主屏幕开始你的活动。
答案 2 :(得分:-1)
来自Docs:
不要从广播接收器开始活动,因为用户体验很不稳定;特别是如果有多个接收器。相反,请考虑显示通知。