6

サービスが特定のアクティビティから終了したかどうかを知りたいので、を呼び出している間、そのアクティビティから文字列を渡しますstopServivce(service)

コードは次のとおりです。

Intent service = new Intent(Activity.this,
                        service.class);
                service.putExtra("terminate", "activity terminated service");
                stopService(service);

getIntent().getExtras().getString("terminate);しかし、メソッド内でこの変数にアクセスしているように見えますonDestroy()

[編集]

この障害を回避する方法を見つけましたが、それでも私の質問に答えてもらいたいと思います。アクティビティのメソッドで実行する必要があることをすべて実行してからonDestroy()、を呼び出しstopService(service)ました。私の状況がこれ以上複雑なものを必要としなかったのは幸運でした。

4

3 に答える 3

13

にアクセスする方法はありませIntentonDestroy。他の方法(バインダー、共有設定、ローカルブロードキャスト、グローバルデータ、またはメッセンジャー)でサービスに信号を送る必要があります。ブロードキャストを使用する良い例がこの回答に示されています。startServiceの代わりにを呼び出すことで、これを機能させることもできますstopServicestartService新しいサービスがまだ存在しない場合にのみ開始するため、への複数の呼び出しは、サービスにsをstartService送信するメカニズムです。Intentこのトリックはによって使用されていることがわかりますBroadcastReceivers。にアクセスできるので、エクストラを確認し、終了するように指示された場合は呼び出すことIntentonStartCommand、終了を実装できます。これが実際のスケッチです- IntentstopSelf

public int onStartCommand(Intent intent, int flags, int startId) {
        final String terminate = intent.getStringExtra("terminate");

        if(terminate != null) {
            // ... do shutdown stuff
            stopSelf();
        }
        return START_STICKY;
    }
于 2013-01-22T07:16:26.040 に答える
0

iagreenが示唆することを説明するためだけに。

活動中

Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.yourfilter");
broadcastIntent.putExtra("activity_name", "your_activity");

sendBroadcast(broadcastIntent);

稼働中

 private YourActionReceiver abc;

    this.abc = new YourActionReceiver();

    registerReceiver(this.abc, new IntentFilter("com.package.yourfilter"));

    public class YourActionReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
    // Get the name of activity that sent this message
    }
}
于 2013-01-25T15:59:46.817 に答える
-1

グローバルステート

あなたの友だちです。:)
必要なときはいつでも(終了する前に)グローバル文字列をチェックしてください。列挙型も必要になる場合がありますstateまたは、状態が有効かどうかを確認するためのフラグ。

レシピ:

発生しているより一般的な問題は、いくつかのアクティビティとアプリケーションのすべての部分にわたって状態を保存する方法です。静的変数(たとえば、シングルトン)は、これを実現するための一般的なJavaの方法です。ただし、Androidでのより洗練された方法は、状態をアプリケーションコンテキストに関連付けることです。

ご存知のように、各アクティビティはコンテキストでもあり、最も広い意味での実行環境に関する情報です。アプリケーションにもコンテキストがあり、Androidは、アプリケーション全体で単一のインスタンスとして存在することを保証します。

これを行う方法は、 android.app.Applicationの独自のサブクラスを作成し、マニフェストのアプリケーションタグでそのクラスを指定することです。これで、Androidはそのクラスのインスタンスを自動的に作成し、アプリケーション全体で利用できるようにします。Context.getApplicationContext()メソッドを使用して、任意のコンテキストからアクセスできます(Activityは、まったく同じ効果を持つgetApplication()メソッドも提供します)。

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

class BlahBlah extends Service {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

これは、静的変数またはシングルトンを使用する場合と基本的に同じ効果がありますが、既存のAndroidフレームワークに非常によく統合されます。これはプロセス間では機能しないことに注意してください(アプリが複数のプロセスを持つまれなアプリの1つである必要があります)。

クレジットは@Soonilに送られます

于 2013-01-23T04:15:56.210 に答える