1

android.intent.action.DOWNLOAD_COMPLETEAndroidのDownloadManagerクラスから完了したダウンロードを受信するブロードキャストレシーバーがあります。ブロードキャスト レシーバは、XML で次のように定義されています。

<receiver android:name=".DownloadReceiver" >
  <intent-filter>
    <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
  </intent-filter>
</receiver>

アクティビティを実行し続けると、すべてがうまく機能します。DOWNLOAD_COMPLETEただし、サービスがバックグラウンドで実行されているときにアクティビティが実行されていない場合、ブロードキャストが受信されるたびにバックグラウンド サーバーが強制終了されます。

ブロードキャストレシーバーは次のとおりです。

public class DownloadReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
       // it will cause MyService to be killed even with an empty implementation!
   }
}

サービスは次のとおりです。

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        Log.w(TAG, "onBind called");

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.w(TAG, "onCreate called");

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        Log.w(TAG, "onStartCommand called");

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.w(TAG, "onDestroy called");
    }
}

アクティビティはサービスを開始します:

public class MainActivity extends Activity {

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

            startService();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);

    return true;
}

public void startService() {
    Intent start = new Intent(getApplicationContext(), MyService.class);
    startService(start);
}

public void stopService() {
    Intent stop = new Intent(getApplicationContext(), MyService.class);
    stopService(stop);
}
}

アクティビティが実行されていないときに、サービスがブロードキャストによって強制終了された理由は何ですか?

ありがとう!!

4

1 に答える 1

0

どこから に電話をかけstopService()ますか?

でコールを発信している場合ActivityonPause()またはonStop()を離れるたびに、またはがシステムによって破棄されたときに、onDestroy()が停止されます。ServiceActivityActivity

あなたが投稿したコードから、BroadcastReceiverまたはシステムブロードキャストとあなたとの間に接続が見られません。Service

于 2013-03-27T05:05:33.260 に答える