我试图创建一个简单的BroadcastReceiver,它可以接收android.intent.action.BOOT_COMPLETED意图以及android.intent.action.MEDIA_MOUNTED意图。我们的想法是在接收这些意图中的任何一个时启动服务。因此,应该在Android启动完成后或USB存储设备连接到Android目标时启动服务(如果此时服务尚未启动)。 应用程序使用的权限在本节中定义
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
以下部分定义了负责处理意图和启动相应服务的BroadcastReceiver。
<receiver
android:name="com.example.systemupgradeapplication.IntentReceiver"
android:label="USB Detection Receiver"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
<intent-filter android:priority="999" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
应从广播接收器启动的相应服务在以下部分中定义
<service android:name=".SysUpgradeService" />
注意:接收器和服务组件是在Android Manifest的<application>
部分中定义的。
以下代码段是负责处理广播意图的类
public class IntentReceiver extends BroadcastReceiver {
private final static String TAG = "IntentReceiver";
private static boolean m_UsbInserted = false;
private static boolean m_UsbRemoved = true;
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= ");
// TODO Auto-generated method stub
//if(intent.)
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
String path = intent.getDataString();
if(path.contains("usb")) {
m_UsbInserted = true;
Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= "+path);
Intent myIntent = new Intent(context, SysUpgradeService.class);
myIntent.putExtra("path", path);
context.startService(myIntent);
}
}else if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.d(TAG, "BOOT Completed intent received");
context.startService(new Intent(context, SysUpgradeService.class));
}
我面临的问题是没有任何意图到达我的广播接收器(IntentReceiver类中的任何日志都没有在logcat中打印),即使我在Android调试日志中可以看到BOOT_COMPLETE和MEDIA_MOUNTED意图正在播出。此外,在Android系统启动后,此应用程序无法启动。
我感谢你在这方面的帮助,我的方法和一些可能的解决方案可能出错。
答案 0 :(得分:3)
好的,所以我将apk推送到/ system / priv-app,这是作为自定义ROM一部分的系统应用程序所在的位置。现在我在我的应用程序中不需要任何活动,因为它是自定义ROM的一部分,并被识别为系统应用程序。似乎如果您的应用程序是第三方应用程序,它必须具有能够接收广播意图的活动。 但是在这种情况下,我可以控制自定义ROM源代码以及设备上的root访问权限。所以两种方法都有效
答案 1 :(得分:1)
确保您已经在应用程序中存在一项活动。从Android 3.1开始,在用户手动启动活动之前,BroadcastReceiver将无法工作,这是为了提供安全性。一旦用户第一次运行应用程序,那么您的BroadcastReceiver将始终运行,除非它没有强制停止它。一旦首次启动活动,您的广播接收器即使在重启后也会运行。