如何避免/取消应用程序自运行由于BroadcastReceiver



我有BroadcastReceiver的应用程序,它侦听SD卡装入/卸载,如:

public class ExternalDatabaseRemovingBroadcastReceiver extends BroadcastReceiver
{
    private static final String TAG= ExternalDatabaseRemovingBroadcastReceiver.class.getName();
    public ExternalDatabaseRemovingBroadcastReceiver()
    {
        super();
    }
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if(Me.DEBUG)
            Log.d(TAG, "SD card mount/unmount broadcast=" + intent.getAction());
        if(intent.getAction()==null)
            return;
        if(Intent.ACTION_MEDIA_UNMOUNTED.equalsIgnoreCase(intent.getAction()) ||
                Intent.ACTION_MEDIA_EJECT.equalsIgnoreCase(intent.getAction()) ||
                Intent.ACTION_MEDIA_SHARED.equalsIgnoreCase(intent.getAction()))
        {
              //blah-blah
        }
    }
}

Broadcast在AndroidManifest中声明为:

<receiver android:enabled="true"
          android:exported="true"
          android:name=".ExternalDatabaseRemovingBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_MOUNTED"/>
        <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
        <action android:name="android.intent.action.MEDIA_SHARED"/>
        <data android:scheme="file"/>
    </intent-filter>
</receiver>

现在是我的问题。在设备启动期间(无论是真实的还是模拟器)-我的应用程序无意中运行。我的意思是ActivityManager自己运行报告:

11-22 08:56:52.239: INFO/ActivityManager(61): Start proc ru.ivanovpv.cellbox.android for broadcast ru.ivanovpv.cellbox.android/.ExternalDatabaseRemovingBroadcastReceiver: pid=288 uid=10034 gids={1015}

请解释一下发生了什么事?如何避免应用程序自运行?

听起来像是系统在启动时响应SD卡安装。通过删除android:exported="true"或将其更改为false,并启用<permission>,可以将启动该BroadcastReceiver的访问权限列入白名单。我不知道你这样做的最终目的是什么,所以这可能不是最好的做法。

在我看来,在启动设备时,SD卡也被安装,这触发了你的意图过滤器。如果你不想让这个"初始"挂载被应用程序注册,你可以忽略在正常运行时间的前x秒内发生的挂载。不过,这可能不是最优雅的解决方案……


编辑:现在我明白了barmaley的初衷,解决方案要简单得多。Android清单中的意图过滤器是用来在发生外部情况时启动应用程序的。如果您只想在应用程序已经运行时响应(un)挂载,只需在Application.create中以编程方式注册broadcastreceiver,并分别使用Context.registerReceiverContext.unregisterReceiverApplication.destroy中注销它。

最新更新