如果应用程序安装在外部存储上,我如何使用广播接收器并同时为它们提供服务。我编程但只是在内部存储设备上运行,因为我想在设备重启服务时运行而不是启动活动
我的活动:
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) {
}
}
答案 0 :(得分:1)
为了使您的应用程序始终如一地按预期运行,如果应用程序使用以下任何功能,则不应允许将应用程序安装在外部存储上...
广播接收器正在侦听&#34;启动已完成&#34;
在将外部存储装置到设备之前,系统会传送ACTION_BOOT_COMPLETED广播。如果您的应用程序安装在外部存储器上,则它永远不会接收此广播。
引用the documentation, this time for ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
中的其他地方:
额外数据EXTRA_CHANGED_UID_LIST包含可用性已更改的包的uid列表。请注意,此列表中的包不会收到此广播。
因此,您需要将应用设置为不安装在外部存储设备上。