启动设备后我的android服务无法启动

时间:2013-04-26 11:11:47

标签: android android-intent

我打赌这是一再重复的问题,但我需要再问一次。即使我已经下面的代码

,服务也无法启动
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <receiver android:name=".MyBroadcastreceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>         

    <activity
        android:name="com.im.HomeActivity"
        android:clearTaskOnLaunch="true"
        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="com.im.ListActivity"
        android:label="@string/title_activity_list" >
    </activity>

    <service
        android:name="com.im.SyncService"
        android:process=":remote" >
    </service>
</application>

public class MyBroadcastreceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        Intent intent = new Intent(context, SyncService.class);
        context.startService(intent);
        Log.i("Autostart", "started");          
    }   
}

请帮帮我。

2 个答案:

答案 0 :(得分:0)

你的BraodcastReciever被调用了吗?

如果没有,那么原因可能如下:

  

从3.1开始安装应用程序时,它们位于   “停止”状态,因此他们将无法运行直到用户   明确启动它们。按下强制停止将返回它   状态。

     

一旦用户第一次运行应用程序(并且没有强制停止   它),一切都像以前一样 - 重启将导致BOOT_COMPLETED   要收到的广播等等。但是,如果用户安装了   应用程序,除非他们手动运行应用程序,否则不会进行广播   接收。

因此,在您的情况下,您必须创建启动器活动,并确保至少启动一次启动器活动然后您将开始接收启动事件广播。

Source

答案 1 :(得分:0)

从Android 3.1开始,用户必须至少启动一次应用程序,然后您的应用才能收到android.intent.action.BOOT_COMPLETED个事件。

此外,您的清单文件中已设置android:allowBackup="true",请确保SD卡上的应用。如果您要保存到外部存储空间,则需要设置android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE

在某些手机(如HTC)上有快速启动选项,如果已激活,则不会调用BOOT_COMPLETE

另一种方法是使用Intent.ACTION_SCREEN_ON并检查服务是否正在运行,如果不是,则启动服务。更多信息here