2013-04-26 97 views
0

我敢打賭,這是重複的問題,但我需要再問一遍。服務無法啓動,即使我已經把下面的代碼我的android服務無法啓動後啓動設備

<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");   
    } 
} 

幫助我,請。

+0

*「服務無法啓動」*您如何知道?任何錯誤消息? 'MyBroadcastreceiver#onReceive()'是否被調用? 'startService()'返回什麼? – m0skit0 2013-04-26 11:21:18

回答

0

您的BraodcastReciever被調用?

如果沒有那麼原因可能如下:

與3.1開始時安裝的應用程序,他們是在一個 「停止」狀態,所以他們將無法直到用戶 明確地啓動它們運行。按力量停止將返回到這個 狀態。

一旦用戶運行首次應用程序(並不會強制停止 吧),一切都表現爲前 - 重新啓動將導致接收BOOT_COMPLETED 廣播等。但是,如果用戶安裝了 應用,則除非他們手動運行該應用,否則不會收到收到的廣播 。

因此,在您的情況下,您將不得不創建啓動器活動,並確保您至少啓動啓動器活動一次,然後您將開始接收啓動事件廣播。

Source

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