3

チェックボックスのあるアクティビティがあります。チェックボックスがオフになっている場合は、サービスを停止してください。これは私のアクティビティコードのスニペットです:

    Intent serviceIntent = new Intent();
    serviceIntent.setAction("com.android.savebattery.SaveBatteryService");

    if (*unchecked*){
        serviceIntent.putExtra("user_stop", true);
        stopService(serviceIntent);

サービスを停止するときは、パラメータ「user_stop」を渡して、システムではなくユーザーがサービスを停止したことを示します(メモリ不足の場合)。

ここで、サービスのvoidonDestroyにある変数「user_stop」を読み取る必要があります。

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

Intent recievedIntent = getIntent(); 
boolean userStop= recievedIntent.getBooleanExtra("user_stop");

    if (userStop) {
       *** notification code ****

しかし、それは機能しません!onDestroyでgetIntent()を使用できません!

なにか提案を?

ありがとう

シモーネ

4

4 に答える 4

7

これを行うには2つの方法があります。

  1. 共有設定の使用。
  2. ローカルブロードキャストを使用します。

最初のアプローチは、簡単で簡単な方法です。しかし、それはあまり柔軟ではありません。基本的にあなたはします:

  • a。「ユーザー停止」共有設定をtrueに設定します。
  • b。サービスを停止する
  • c。onDestroyでサービスを提供する場合は、「ユーザー停止」設定の値を確認してください。

もう1つのアプローチはより良い方法ですが、より多くのコードが必要です。

  • a。サービスクラスで文字列定数を定義します。
final public static string USER_STOP_SERVICE_REQUEST = "USER_STOP_SERVICE".
  • b。内部クラスBroadcastReceiverクラスを作成します。

    public class UserStopServiceReceiver extends BroadcastReceiver  
    {  
        @Override  
        public void onReceive(Context context, Intent intent)  
        {  
            //code that handles user specific way of stopping service   
        }  
    }
    
  • c。このレシーバーをonCreateまたはonStartメソッドに登録します。

    registerReceiver(new UserStopServiceReceiver(),  newIntentFilter(USER_STOP_SERVICE_REQUEST));
  • d。サービスを停止したい場所から:

    context.sendBroadcast(new Intent(USER_STOP_SERVICE_REQUEST));

このアプローチを使用して、Intentを介して任意のカスタム引数を渡すことができることに注意してください。

于 2011-01-10T23:06:24.553 に答える
1

onDestroy()に依存するのは良いことではないと思います。あなたが取ることができるいくつかのアプローチがあります。

  1. onUnbind http://developer.android.com/guide/topics/fundamentals.html#servlifeにユーザー停止通知を書き込むことができるように、サービスをバインドすることをお勧めします

  2. 他のオプション(これが機能するかどうかはわかりません)は、変数をSharedPreferencesに投稿し、onDestroy()から取得することです。[これがデバッグモードまたはLogCatメッセージで機能するかどうかを確認する必要があります。

于 2011-01-10T22:31:18.470 に答える
-1

アクティビティで CheckBoxPreference を使用し、サービス クラスの onCreate で getSharedPreference を使用して、アプリで同じ設定を行います。チェックボックスをオンにすると、サービスが開始されます。チェックを外すとサービスが停止します。

私のアクティビティで好みのクリックを聞いて処理します。

    getPreferenceManager().findPreference("prefEnable").setOnPreferenceClickListener(new OnPreferenceClickListener()
    {
        // not used: Intent intent = new Intent(this, MyService.class);
        @Override
        public boolean onPreferenceClick(Preference preference) {
            CheckBoxPreference cb = (CheckBoxPreference) preference;
            if (cb.isChecked()) {
                Log.d(TAG, "User enabled service");
                // code to start service
            } else {
                Log.d(TAG, "User disabled service");
                // code to stop service
            }
            return true;
        }
    });

サービス onCreate 内で「prefEnable」設定を取得します。

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean isEnabled = preferences.getBoolean("prefEnable", false);

おそらく onDestroy で、これを再利用して次のように言うことができます。

if (isEnabled==false) {
   *** notification code ***
于 2011-01-11T22:05:50.047 に答える
-1

// この簡単な方法でパラメータを渡すことができます:-

Intent serviceIntent = new Intent(this,ListenLocationService.class); 
   serviceIntent.putExtra("From", "Main");
   startService(serviceIntent);
//and get the parameter in onStart method of your service class

    @Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
     Bundle extras = intent.getExtras(); 
if(extras == null)
    Log.d("Service","null");
else
{
    Log.d("Service","not null");
    String from = (String) extras.get("From");
    if(from.equalsIgnoreCase("Main"))
        StartListenLocation();
}

}
Enjoy :)
于 2013-05-28T12:24:58.780 に答える