2015-01-21 84 views
1

我试图创建一个简单的BroadcastReceiver,它可以接收android.intent.action.BOOT_COMPLETED intent以及android.intent.action.MEDIA_MOUNTED intent。这个想法是开始接受这些意图的服务。因此,应在Android引导完成或USB存储设备连接到Android目标(如果服务尚未启动)之后启动该服务。由应用程序使用 权限将在本节Broadcast Receiver not receiving BOOT and MEDIA_MOUNTED intent

<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" /> 

以下部分定义负责处理意图和起动相应的服务的广播接收器定义。

<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清单的<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类(日志中没有被即使我可以在Android Debug日志中看到正在广播BOOT_COMPLETE和MEDIA_MOUNTED意图,也可以在logcat中打印)。此外,此应用程序不启动后,Android系统启动。

感谢您在这方面的帮助,我的方法和一些可能的解决方案可能有什么问题。

回答

3

好的,所以我把apk安装到/ system/priv-app,这是系统应用程序是定制ROM的一部分。现在我不需要在我的应用程序中进行任何活动,因为它是自定义ROM的一部分,并被识别为系统应用程序。看起来,如果你的应用程序是第三方应用程序,它必须有一个能够接收广播意图的活动。 但是在这种情况下,我可以控制自定义ROM源代码以及设备上的root访问权限。所以这两种方法都可以工作

  1. 使您的应用程序成为自定义ROM源的一部分,在设备上生成并进行闪存。
  2. 在设备上获得root访问权限,将你的apk文件推送到/ system/priv-app(4.4以后),重新启动并且瞧!
+0

是的,它让我等待2天,直到我可以接受我自己的答案。感谢提醒@DavidWasser – SCCC 2015-01-23 12:09:18

1

确保您的应用程序中存在一项活动。从Android 3.1开始,只有用户手动启动活动时,BroadcastReceiver才会工作,这是为了提供安全性。一旦用户第一次运行应用程序,那么您的BroadcastReceiver将一直运行,除非它不强制停止它。一旦第一次启动活动,您的广播接收机即使在重新启动您的设备后也会运行。

+0

您的意思是说我可以在安装应用程序后启动一个虚拟空白活动一次,因此即使我没有在重新启动后启动/启动活动,应用程序仍会继续接收意图并根据需要启动服务,对? – SCCC 2015-01-21 10:03:38

+0

你在这个应用程序中有任何活动吗? – PPD 2015-01-21 10:04:59

+0

不,我在这个应用程序中没有任何活动。这个想法是在后台线程中启动服务,这个应用程序应该执行系统升级,类似于手机/平板电脑中Android软件的升级,因此我们的目的并不需要一个活动。 – SCCC 2015-01-21 10:07:48

相关问题