2015-07-20 123 views
1

我已閱讀關於此問題的幾個答案,但發佈的解決方案對我無效。在我的代碼中可能有錯或錯過了。 我需要我的應用程序沒有任何活動,在啓動完成後自動啓動。 如果我包括一個活動,只是爲了第一次啓動應用程序(退出停止狀態),一切正常。 非常感謝您的幫助。android;啓動後服務自動啓動:FLAG_INCLUDE_STOPPED_PACKAGES不起作用

這是我的代碼。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="zag.salva" > 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
<uses-permission android:name="android.permission.READ_CALL_LOG" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <receiver 
     android:name=".Salva_autostart" 
     android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name=".Salva_servizio" 
     android:enabled="true" > 
     <intent-filter> 
      <action android:name=".Salva_servizio" /> 
     </intent-filter> 
    </service> 

</application> 

Salva_autostart.java

public class Salva_autostart extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Intent intento = new Intent(context, Salva_servizio.class); 
     intento.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
     context.startService(intento); 
    } 


} 

Salva_servizio.java

public class Salva_servizio extends Service 
{ 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     // Task execution 
     Salva_invio2 invio = new Salva_invio2(); 
     invio.esegui(this); 
     return Service.START_NOT_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

回答

0

注意,由於Android 3.0的用戶需要在應用程序可以接收android.intent.action.BOOT_COMPLETED事件之前至少啓動一次應用程序。

+0

但這將是默認行爲;這就是爲什麼我介紹setFlags()語句;這不是這樣嗎?謝謝 – MarioZ

+1

應用程序在首次安裝但尚未啓動時以及用戶手動停止時(在「管理應用程序」中)處於停止狀態。默認情況下,系統將FLAG_EXCLUDE_STOPPED_PACKAGES添加到所有廣播意圖,並且您的BroadcastReceiver正在偵聽系統廣播。所以基本上你的Salva_autostart不會得到任何意圖,如果用戶不啓動你的應用程序。如果它沒有得到任何意圖,它也不能啓動服務。 –

+0

你還在想什麼?我的回答是對的?如果是這樣,請評價或投票。 –

4

您不應該將FLAG_INCLUDE_STOPPED_PACKAGES添加到您的接收方意圖開始您的服務。您必須將其添加到您用於sendBroadcast的意圖。意思是說,您需要將其添加到調用廣播的應用程序中。 這就是爲什麼這個標誌在你的代碼中是不相關的。

如果您將sendBroadcast從接收器(「Salva_autostart」)僅一次,從您的應用程序之外 - 那麼您的應用程序將不再處於「強制停止」狀態,並且在下次啓動時,您的接收器將被觸發。

此外,您應該添加(addFlags)而不是設置(setFlags)。

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 

這是你應該如何從其他應用程序觸發接收器:

Intent intent = new Intent("com.xxx.my_filter_intent"); 
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
    this.sendBroadcast(intent); 

在您的清單上面的過濾器意圖添加到您的接收器(您可以在新的<intent-filter>或在同一添加它是你已經爲BOOT_COMPLETED行動

<receiver 
    android:name=".Salva_autostart" 
    android:enabled="true" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 

    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="com.xxx.my_filter_intent" /> 
    </intent-filter> 
</receiver> 

在這裏閱讀更多: http://developer.android.com/about/versions/android-3.1.html#launchcontrols

+0

即使強制關閉應用程序設置後,它是否會讓我的服務在後臺運行? – himCream

+0

嗨HimCream,強制停止後,它不會讓服務繼續運行,廣播中的這個標誌只會在廣播再次發送時觸發您的接收器(即使您的應用程序正在強制停止)。 然後,如果您的接收器啓動服務 - 您的服務將再次啓動。 –