2011-12-16 6 views
2

Androidのバックグラウンドサービスを実行しているBroadcastReceiverが特定の種類のインテントを受信して​​いるセットアップがあります。これらのインテントは、放送受信機がサービス内の特定のメソッドを呼び出すために使用されます。以下は、サービスの構造を記述したコードです:アプリケーションクラスからAndroidサービスにインテントをブロードキャストできない

public class MyService extends Service { 

    private class ServiceBroadcastReceiver extends BroadcastReceiver { 


      private MyService getMyService() { 
       return MyService.this; 
      } 

      public IntentFilter getASReceiverFilter() { 
       IntentFilter filter = new IntentFilter() 
       filter.addAction(Constants.ACTION_DO_SOMETHING); 
       return filter; 
      } 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // TODO Auto-generated method stub 
       MyService svc = getMyService(); 
       String intentAction = intent.getAction(); 
       Log.i(Constants.LOG_TAG, "Now trying to dispatch following action: " + intentAction); 
       //Dispatch to the appropriate method in MyService. 
       if (intentAction.equals(AppServiceConstants.ACTION_DO_SOMETHING)) { 
        svc.doSomething(); 
       } 
      } 
     } 


    private ServiceBroadcastReceiver mRequestReceiver = new ServiceBroadcastReceiver(); 


    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


    @Override 
    public void onCreate() { 

     Log.i(Constants.LOG_TAG, "Service Created!"); 
     //Register for broadcast messages indicating the add music button was pressed 
     mRequestReceiver = new ServiceBroadcastReceiver(); 
     registerReceiver(mRequestReceiver, mRequestReceiver.getASReceiverFilter()); 
    } 



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

     Log.i(Constants.LOG_TAG, "Service Starting ... "); 

     // If we get killed, after returning from here, restart 
      return START_STICKY; 
    } 



    /*********************************************************************************** 
    * Service Dispatch Methods 
    */ 
    protected void doSomething() { 
     Log.i(Constants.LOG_TAG, "Doing something"); 
    } 



} 

私の問題は、私のアプリ全体から放送の意図をキャプチャするために、このサービスとその放送の受信機を得ることです。私が次のようなことをすれば....

getApplicationContext().sendBroadcast(new Intent(Constants.ACTION_DO_SOMETHING)); 

..私はそれをアクティビティ内から呼び出すと機能します。しかし、アプリケーションを最初に起動しても「何か」できるようにしたいので、MyServiceを作成して起動した直後に、onCreate()メソッドの独自のカスタムアプリケーションサブクラスにその文を入れました。何らかの理由で、アプリケーションの起動時にアプリケーションのクラスコード内からブロードキャストが機能していませんが、アクティビティ内のコード(たとえば、アクティビティのonCreate()メソッドなど)に置くと機能します。サービスのonCreate()メソッドとonStartCommand()メソッドがApplicationオブジェクトのインテントをブロードキャストする前に呼び出されていることを確認できますが、単にインテントを取得して関連する作業を行うようには見えません。

ご協力いただければ幸いです。

アップデート:ここで

は、私は(私が最初にサービスを開始することに注意してください)私のアプリケーションからのブロードキャストを送信する方法である:私は実際に行う前に、私はサービスを始めている

public class MyApplication extends Application { 
     @Override 
     public void onCreate() { 
      Intent intent = new Intent(getApplicationContext(), MyService.class); 
     getApplicationContext().startService(intent); 
    getApplicationContext().sendBroadcast(new Intent(Constants.ACTION_DO_SOMETHING)); 

     } 

} 

注意放送。サービスは放送を受信しませんが、私が後で起動するアクティビティから同様の呼び出しを行うと、受信します。

答えて

6

お客様のApplicationは、プロセス内の他のコンポーネントの前に作成されます。したがってonCreate()にはSerivceが実行されていません。また、アプリケーションのonCreate()が呼び出された時点でブロードキャストを送信した場合、Serviceには作成されていないため、ブロードキャスト受信者が登録されていません。

つまり、ブロードキャスト受信者がまだ登録されていないため、サービスはブロードキャスト通知を受信して​​いません。 Serviceがまだ起動していないため、まだ登録されていません。また、アプリケーションのonCreate()が設計通りに返却される前に開始することはできません。

Context.startService()を使用して直接サービスを開始することができます。アプリケーションのonCreate()です。必要なすべてのデータをIntentに転送することができます。


更新の質問への答えの更新:あなたは、いくつかの後の時間にサービスを開始するには、Androidを頼む

getApplicationContext().startService(intent); 

を呼び出します。サービスはすぐに開始されたではありません。それは後で始める予定です。実際には、アプリケーションのonCreate()機能から戻る前に間違いなく開始されます。これは、すべてのサービスのライフサイクルコールバック関数(onCreate()およびonStart()など)がメインUIスレッドから呼び出されるためです。アプリケーションのonCreateは現在、メインのUIスレッドをブロックしています。だから、

あなたはこれらのコード行を使用してブロードキャストを送信します

getApplicationContext().startService(intent); 
getApplicationContext().sendBroadcast(new Intent(Constants.ACTION_DO_SOMETHING)); 

あなたが実際にその直後にブロードキャストを送信し、その後、いくつかの後の時間にサービスを開始するように依頼。サービスは開始してこのブロードキャストに登録するチャンスもなく、通知が実際に開始されたときに何も通知されません。

あなたは、意思を処理してから使用してサービスを開始するにはあなたのサービスのonStart()コードを変更することができます:

Intent intent = new Intent(getApplicationContext(), MyService.class); 
intent.setAction(Constants.ACTION_DO_SOMETHING); 
getApplicationContext().startService(intent); 
+0

上記の私の更新を参照してください、私は実際に放送する前にサービスを開始しようとします。 – Faisal

+0

私は答えを更新しました。 – inazaruk

+0

ありがとうございました。 – Faisal

関連する問題