应用关闭后广播接收器仍在运行 - Android

3
我正在使用这篇教程中的一些代码来接收短信:
代码完美地运行并且正好符合我的要求。
我遇到了一个问题。
我希望我的应用可以在后台运行,但是当它关闭时,我希望它停止拦截短信。
我的问题是,为什么我的应用在关闭后仍然拦截短信?
我想我必须找到一个“关闭”处理程序然后关闭广播接收器(如果有“关闭”事件处理程序的话...)。
如果有人能提供一些见解,我将非常感激。谢谢!

你的意思不是关闭应用程序,对吗?我想你的意思是将应用程序最小化。当应用程序关闭时,接收器当然不会拦截任何操作。 - Anil P Babu
3个回答

17

将你的 BroadcastReceiver 放在 Manifest 中,默认情况下它将一直处于活动状态。因此,如果你想要它仅在你的 Activity 显示时运行,你需要在你的 Activity 恢复/暂停时启用/禁用你的 BroadcastReceiver

public void onResume()
{
    ComponentName component=new ComponentName(this, TextMessageReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

public void onPause()
{
    ComponentName component=new ComponentName(this, TextMessageReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
}

另一种选择是在您的Activity中声明BroadcastReceiver,然后在同一个生命周期事件中调用registerReceiverunregisterReceiver


所以如果我们把这些放在MainActivity中,当转到下一个活动时,广播接收器会被注销吗? - Dr.jacky
@Mr.Hyde - 正确,只有当活动正在运行时广播接收器才会处于活动状态。 - ianhanniballake

0

我在这里看了一下,这是我的结论

try{
        unregisterReceiver(mybroadcast);
    }catch(IllegalArgumentException e){
        Log.d("reciever",e.toString());
    }

我会建议在onDestroy()方法中重写并将代码放在其中。

-1
我会建议在你的应用程序对象上重写OnTerminate()方法,并在那里注销你的接收器。
@Override
public void onTerminate() {
    unregisterReceiver(mybroadcast);
    super.onTerminate();
}

2
不要使用onTerminate()方法, public void onTerminate()API级别1中添加 此方法用于模拟进程环境中。在生产Android设备上,进程被简单地杀死以删除它们; 在这样做时不执行任何用户代码(包括此回调)。 http://developer.android.com/reference/android/app/Application.html#onTerminate() - Mohamed Heiba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接