如何使用广播接收器与服务

时间:2014-11-09 08:56:19

标签: android

如果应用程序安装在外部存储上,我如何使用广播接收器并同时为它们提供服务。我编程但只是在内部存储设备上运行,因为我想在设备重启服务时运行而不是启动活动

我的活动:

 public class FirstClass extends Activity 
 {
  public void onCreate(Bundle savedInstanceState) 
 {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first);
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() 
    {
       public void run()
       {
        startService(new Intent(getApplicationContext(), MyService.class));
        startActivity(new Intent(FirstClass.this, MainActivity.class));
        finish();
       }
    },5000);
  }
 /////////////////////////////////////////////////
 }

我的广播接收器:

 public class BroadcastReceiverOnTurnedOn extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
  Intent startServiceIntent = new Intent(context, MyService.class);
  context.startService(startServiceIntent);
   }
 }

我补充说:

<service
    android:name="com.dariran.MyService"
    android:enabled="true"
    android:exported="true" >
</service>
<receiver android:name="com.dariran.BroadcastReceiverOnTurnedOn"
android:enabled="true">
  <intent-filter android:priority="1">
    <action android:name="android.intent.action.BOOT_COMPLETED" /> 
  </intent-filter>
  <intent-filter>
    <action  android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" />
  </intent-filter>
</receiver>

到Manifest.xml上的appliation标签 我将此代码添加到我的服务类中,以设置过滤器来识别外部存储,但不再重复:(

 @Override
 public void onStart(Intent intent, int startId) {
 try {

 IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
 filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
 BroadcastReceiver mReceiver = new BroadcastReceiverOnTurnedOn();
 registerReceiver(mReceiver, filter);

 } catch (Exception e) {
 }
}

1 个答案:

答案 0 :(得分:1)

引用the documentation

  

为了使您的应用程序始终如一地按预期运行,如果应用程序使用以下任何功能,则不应允许将应用程序安装在外部存储上...

     

广播接收器正在侦听&#34;启动已完成&#34;
     在将外部存储装置到设备之前,系统会传送ACTION_BOOT_COMPLETED广播。如果您的应用程序安装在外部存储器上,则它永远不会接收此广播。

引用the documentation, this time for ACTION_EXTERNAL_APPLICATIONS_AVAILABLE中的其他地方:

  

额外数据EXTRA_CHANGED_UID_LIST包含可用性已更改的包的uid列表。请注意,此列表中的包不会收到此广播。

因此,您需要将应用设置为不安装在外部存储设备上。