2015-01-09 156 views
3

我想創建一個僅包含服務(無活動)的應用程序。該服務必須在啓動時啓動。 我的問題是,似乎引導接收器似乎沒有打電話,如果沒有活動。 我對以下示例進行了測試。 我有不同的文件:啓動時無需啓動服務

MyReceiver.java:

package com.test.teststartserviceatboot; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.Toast; 

public class MyReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context ctx, Intent i) { 

     Log.v("MyReceiver", "onReceive : "); 
     Intent intent = new Intent(ctx, MonService.class); 
     ctx.startService(intent); 
    } 
} 

MyService.java:

package com.test.teststartserviceatboot; 

import android.app.Service; 

public class MyService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.v("MyService","onStartCommand"); 
     return super.onStartCommand(intent, flags, startId); 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     Log.v("MyService","onBind"); 
     return null; 
    } 
} 

MainActivity.java:

package com.test.teststartserviceatboot; 

import android.app.Activity; 
import android.os.Bundle; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

我只能修改AndroidManifest上我的幾個測試。

  • 試驗1(與活動)

    <uses-sdk android:minSdkVersion="17" 
         android:targetSdkVersion="17"/> 
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    
    <application 
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
    
        <activity 
         android:name=".MainActivity" 
         android:label="@string/title_activity_main" > 
         <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
    
          <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter> 
        </activity> 
        <service 
         android:name=".MyService" 
         android:exported="false" 
         android:label="MyService" > 
        </service> 
    
        <receiver android:name=".MyReceiver" > 
         <intent-filter> 
          <action android:name="android.intent.action.BOOT_COMPLETED" /> 
         </intent-filter> 
        </receiver> 
    </application> 
    

- >重新啓動後,該服務是running.I查看日誌:

AtivityManager開始PROC用於廣播com.test.teststartserviceatboot com.test.teststartserviceatboot/.MyReceiver:PID = 1808 UID = 10156的GID = {50156}

MyReceiver的onReceive
爲MyService onStartCommand

  • 試驗2(無活性)

    <uses-sdk android:minSdkVersion="17" 
         android:targetSdkVersion="17"/> 
    
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    
    <application 
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" > 
        <service 
         android:name=".MyService" 
         android:exported="false" 
         android:label="MyService" > 
        </service> 
    
        <receiver android:name=".MyReceiver" > 
         <intent-filter> 
          <action android:name="android.intent.action.BOOT_COMPLETED" /> 
         </intent-filter> 
        </receiver> 
    </application> 
    

    - >服務沒有運行

    • 測試3

我使用試驗1(與活動)相同appllication。這次我殺了應用程序以重新啓動平板電腦(參數 - >應用程序 - > TestServiceAtBoot->強制停止)。 - >之後重新啓動,服務沒有運行


是否有必要對brodcast接收作品的活動?爲什麼?

感謝您的照顧。

+0

我不這麼認爲。因爲它完美的工作而沒有在manifest.xml中註冊** Activity ** –

+0

@MD他說當一個活動沒有在清單文件中註冊時它不工作 – Leo

+0

@helene如何讓活動充滿活力? – Leo

回答

7

從Android 3.1開始,在用戶手動啓動活動之前,BroadcastReceiver將無法工作,這是爲了提供安全性。一旦用戶第一次運行應用程序,那麼您的BroadcastReceiver將一直運行,除非它不強制停止它。一旦第一次啓動活動,您的廣播接收機即使在重新啓動您的設備後也會運行。

因此,在您的應用程序中,您必須有一個運行BroadcastReceiver的Activity。

+0

以外的唯一方式,但像apps一樣的whatsapp gmail正在運行檢查您是否擁有上述設備3.1 – wadali

+2

@JaswinderWadali因爲他們有活動,所以他們正在跑步。 – PPD

+0

好thanx先生....我會chcek那一點 – wadali