我是Java的新手,但是经验丰富的C#编码器。
我创建了一个可以从活动中开始/停止的服务。 我的问题是,我如何“安装”这项服务,以便它在启动我的设备时启动?
我发现了这个:
Trying to start a service on boot on Android
我试图像这样实现:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="james.jamesspackage" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true">
<activity android:name=".jamessActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".MyService">
<intent-filter>
<action android:name="james.jamesspackage.MyService" />
</intent-filter>
</service>
<receiver android:name="james.jamesspackage.MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
</application>
</manifest>
怎么了?我可以在一个清单中有活动和服务/接收者吗?
由于
詹姆斯
答案 0 :(得分:4)
如何在设备启动时启动服务(自动运行应用程序等)
首先:从Android 3.1+版本开始,如果用户从未启动应用程序至少一次或用户“强制关闭”应用程序,则不会收到BOOT_COMPLETE。 这样做是为了防止恶意软件自动注册服务。此安全漏洞已在较新版本的Android中关闭。
解决方案:
使用活动创建应用。当用户运行它时,应用程序可以收到BOOT_COMPLETE广播消息。
第二个:在安装外部存储之前发送BOOT_COMPLETE。如果app安装到外部存储器,它将不会收到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,你可能还需要添加Manifest这个代码:
<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
享受! )
答案 1 :(得分:3)
看起来接收器部分中的名称是错误的。这是我在AndroidManifest.xml中的应用程序条目:
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".BootListener"
android:enabled="true"
android:exported="false"
android:label="BootListener">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".UpdateService">
</service>
<activity android:name=".Info"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TravelMapperPreferences"
android:label="Settings">
</activity>
</application>
请注意,名称与清单声明中的包相关。您的接收者名称应为“.MyBroadcastReceiver”,因为清单的包中包含james.jamesspackage