Android:启动时启动服务?

时间:2011-05-21 08:20:26

标签: android service boot

我是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>

怎么了?我可以在一个清单中有活动和服务/接收者吗?

由于

詹姆斯

2 个答案:

答案 0 :(得分:4)

如何在设备启动时启动服务(自动运行应用程序等)

首先:从Android 3.1+版本开始,如果用户从未启动应用程序至少一次或用户“强制关闭”应用程序,则不会收到BOOT_COMPLETE。 这样做是为了防止恶意软件自动注册服务。此安全漏洞已在较新版本的Android中关闭。

解决方案:

使用活动创建应用。当用户运行它时,应用程序可以收到BOOT_COMPLETE广播消息。

第二个:在安装外部存储之前发送BOOT_COMPLETE。如果app安装到外部存储器,它将不会收到BOOT_COMPLETE广播消息。

在这种情况下,有两种解决方案:

  1. 将您的应用安装到内部存储
  2. 在内部存储中安装另一个小应用程序。此应用程序接收BOOT_COMPLETE并在外部存储上运行第二个应用程序。
  3. 如果您的应用已安装在内部存储中,则下面的代码可以帮助您了解如何在设备启动时启动服务。


    在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