来自 BroadcastReceiver 的 startActivity()

问题描述 投票:0回答:2

我正在尝试使用在 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() 方法,但 Activity 不会启动。然而日志显示了这一点:

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

知道为什么日志显示活动已启动,但没有任何反应吗?

android android-activity broadcastreceiver
2个回答
27
投票

如果您的目标是希望每当发送

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()

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


-4
投票

来自文档

不要从广播接收器启动活动,因为用户体验会很不和谐;特别是当有多个接收器时。相反,请考虑显示通知。

© www.soinside.com 2019 - 2024. All rights reserved.