我有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.registerReceiver
和Context.unregisterReceiver
在Application.destroy
中注销它。