如何在设备启动(自动运行的应用程序等)上启动服务
首先:自Android 3.1或更高版本起,如果用户至少从未从未启动过您的应用程序或用户“强制关闭”应用程序,则不会收到BOOT_COMPLETE。这样做是为了防止恶意软件自动注册服务。在较新版本的Android中,此安全漏洞已关闭。
解:
创建具有活动的应用程序。用户运行一次后,应用程序会收到BOOT_COMPLETE广播消息。
第二:在安装外部存储器之前发送BOOT_COMPLETE。如果将应用程序安装到外部存储,它将不会收到BOOT_COMPLETE广播消息。
在这种情况下,有两种解决方案:
- 将您的应用安装到内部存储
- 在内部存储中安装另一个小型应用。该应用程序接收BOOT_COMPLETE并在外部存储上运行第二个应用程序。
如果您的应用程序已经安装在内部存储中,则下面的代码可以帮助您了解如何在设备启动时启动服务。
在Manifest.xml中
允许:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
注册您的BOOT_COMPLETED接收者:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
注册您的服务:
<service android:name="org.yourapp.YourCoolService" />
在接收器OnBoot.java中:
public class OnBoot extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// Create Intent
Intent serviceIntent = new Intent(context, YourCoolService.class);
// Start service
context.startService(serviceIntent);
}
}
对于HTC,如果设备未捕获RECEIVE_BOOT_COMPLETED,则可能还需要在清单中添加以下代码:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
接收器现在看起来像这样:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
如何在不重新启动模拟器或真实设备的情况下测试BOOT_COMPLETED?这简单。尝试这个:
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
如何获取设备ID?获取具有ID的已连接设备的列表:
adb devices
默认情况下,您可以在ADT中找到adb
adt-installation-dir/sdk/platform-tools
请享用!)