来自BroadcastReceiver的startActivity()

时间:2010-10-03 13:08:48

标签: android android-activity broadcastreceiver

我正在尝试使用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 }

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

3 个答案:

答案 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

  

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