2009-06-13 13 views
46

私はバックグラウンド(基本的にはプロキシサーバー)で動作し続けるserviceのコンポーネントを持つアプリケーションを作成していますが、そのサービスの開始方法を見つけることができません。アプリケーションはUIやユーザーのやりとりを持つことができないので、私はアクティビティを使用していません。
Broadcast receiverはBOOTブロードキャストを聞くことができますが、インストールされて初めてサービスを開始するにはどうすればいいですか? アプリがインストールされた後に聞くことができるブロードキャストがあります。 TIME_TICKかもしれませんが、それは私が考える活動から登録しなければなりません。サービスのみAndroidアプリを起動する方法

+1

私自身はこれを試していませんが、Applicationオブジェクトからサービスを開始することは可能でしょうか? – phreed

+0

私はそれが動作すると思うhttp://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android

答えて

43

申し訳ありませんが、今すぐアプリケーションがインストールされた後にブロードキャストイベントを受信する信頼できる方法はありません。ACTION_PACKAGE_ADDEDインテントは新しくインストールされたパッケージにブロードキャストしません。

ACTION_BOOT_COMPLETEDイベントを受信するには、ブロードキャスト受信機クラスとサービスが必要です。また、ブロードキャストレシーバーで捕まえる予定のACTION_USER_PRESENTを追加することをお勧めします。これにはAndroid 1.5(minSDK = 3)が必要です。ユーザーが携帯電話のロックを解除するたびにブロードキャスト受信機を呼び出します。サービスが自動的にシャットダウンされることなくサービスを継続できるようにするために最後に行うことは、サービスでService.setForeground()に電話することです。サービスを停止しないことをAndroidに指示するため、これは主にmp3プレーヤータイプサービスは継続していなければなりませんが、どのサービスでも使用できます。

マニフェストでboot_completeイベントとuser_presentイベントに適切な権限を追加してください。

イベントのブロードキャスト受信者として使用できるシンプルなクラスです。

package com.snctln.util.WeatherStatus; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class WeatherStatusServiceReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(intent.getAction() != null) 
     { 
      if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) || 
       intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 
      { 
       context.startService(new Intent(context, WeatherStatusService.class)); 
      } 
     } 
    } 
}; 

幸運。

+7

良いアドバイス。 Service.setForeground()についての1つのこと:Android 2.0以降では動作しません。すべての「長寿命の」サービスは、実行中に通知領域に永続的な通知が必要です。例:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html –

+2

ACTION_USER_PRESENTはすばらしいヒントです。私は長年にわたって私のサービスを生かし続けることに苦労してきましたが、これで解決しました。 – defrex

+0

これはAndroid 4.0.xではうまく動作していないようです。 – ubuntudroid

14

戻りSTART_STICKYService.onStartCommand

にAndroidのは、私は同じ問題を研究していますあなたのサービス

+2

START_STICKYはAndroid 2.0+ – cow

+0

にのみ有効ですが、継続性を得るには少なくとも1回はサービスを実行する必要がありますか? –

0

を再起動します。ここで私が見つけた何をされます: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

は単純で小さなデモはBroadcatReceiverServiceの間でピンポンの少しを再生して解決策を示すこと。受信者は、ACTION_BOOT_COMPLETEDを受信するマニフェストに登録することによって起動時に開始するように登録されています。 ACTION_BOOT_COMPLETEDを受信するとサービスが開始されます。 ServiceBroadcastReceiverを登録し、次にACTION_TIME_TICKを登録します。

アプリケーションロジックはBroadcastReceiverに実装されます。

関連する問題