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));
}
}
注意放送。サービスは放送を受信しませんが、私が後で起動するアクティビティから同様の呼び出しを行うと、受信します。
上記の私の更新を参照してください、私は実際に放送する前にサービスを開始しようとします。 – Faisal
私は答えを更新しました。 – inazaruk
ありがとうございました。 – Faisal