18

バックグラウンドでサービスを実行しようとしています。私のアプリは、ユーザーがチェックボックスをオンにするとサービスが開始され、チェックが外されるとサービスが停止します。これは完全に正常に機能しています。しかし、問題は、タスクマネージャーからアプリを閉じると、サービスも停止することです。私が欲しいのは、タスクマネージャーから閉じた後もサービスを実行し続けることです。その場合、そのサービスを停止する唯一の方法は、ユーザー自身がボックスのチェックを外すことです。

どうすればこれを達成できますか?

これが私のコードです

私の主な活動

public class SampleServiceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final CheckBox cb = (CheckBox) findViewById(R.id.checkBox1);

    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {

            if(isChecked) {
                Toast.makeText(getBaseContext(), "Checked", Toast.LENGTH_LONG).show();
                startService(new Intent(getBaseContext(), MyService.class));
            } else {
                Toast.makeText(getBaseContext(), "Unchecked", Toast.LENGTH_LONG).show();
                stopService(new Intent(getBaseContext(), MyService.class));
            }
        }

    });
}
}

私のサービスクラス

public class MyService extends Service {
Notify n = new Notify();
@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
    n.initNotification(getBaseContext(), true);
    return START_STICKY;
}

//method to stop service
public void onDestroy() {
    super.onDestroy();
    n.cancelNotification(getBaseContext());
    Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
}
}

アップデート

このサービスをgtalkサービスのように実行するにはどうすればよいですか?

4

7 に答える 7

21

あなたが言及している「タスクマネージャー」が異なると異なる動作をするかどうかはわかりません。そのため、ユーザーが設定に移動したときのアクションに基づいて答えています->アプリケーションを管理し、->アプリを強制的に停止しますアンドロイドは彼に与えました。

サービスがプロセスの一部として実行されていると仮定し、ユーザーがプロセスを強制停止した場合、ユーザーが手動で起動するまでサービスを再度実行することはできません。これは、バージョン 3.0 以降で特に有効です(自分のものを確認してください)。 )。また、常にサービスを開始し続け、何らかの形でユーザーを悩ませているアプリがあると考えると、それは論理的に思えます。そのため、ユーザーがアプリでヒット (:) 強制停止) を注文した場合、サービスを再起動してユーザーに迷惑をかけ続けるべきではありません。

たとえば、wake lock を保持することでプロセッサー時間を消費するだけのアプリを作成でき、それらを強制終了できないとしたらどうなるか想像してみてください。これは恐ろしく、巨大なセキュリティ災害になるでしょう。

そのため、ユーザーがいずれかのアクティビティを開始するまで、サービスを再開することはできません。

また、AFAIKの強制停止ボタンを無効にすることはできません。アプリと (限られた範囲で) アクセスが許可されているリソース以外に、デバイス上で制御できるものは何もないという観点を取る必要があります。

最後に、強制停止したい場合は、gtalk アプリでさえあなたの意志に屈します。Gtalk または PUSH Gmail などの gtalk サービスを使用する他のアプリを使用する場合にのみ開始されます (gtalk がファームウェアの一部ではない電話用)。こちらのAndroid C2DMもご覧ください。

https://stackoverflow.com/a/11238779/1218762

于 2012-05-22T18:36:28.730 に答える
2

すべての状況でサービスが強制終了されるのを防ぐことはできません。ただし、システムを再起動するようにシステムに要求することはできます。2つのケースがあります:(1)何らかの異常な理由でプロセスが停止する(2)電話が再起動する。前者では、START_STICKYまたはSTART_REDELIVER_INTENTを使用してサービスを再起動します。後者の場合、android.intent.action.BOOT_COMPLETED用のBroadcastReceiverを追加する必要があります。

コードはonStartCommandからSTART_STICKYを返しているので、サービス再開パスの1つを選択しました:「このサービスの開始中に(onStartCommand(Intent、int、int)から戻った後)このサービスのプロセスが強制終了された場合は、そのままにしておきます開始状態ですが、この配信されたインテントを保持しないでください。後でシステムはサービスの再作成を試みます...」

「このモードは、バックグラウンド音楽の再生を実行するサービスなど、明示的に開始および停止されて任意の期間実行されるものに適しています。」

START_REDELIVER_INTENTを使用することもできます。

サービスが重要な作業を行っている場合は、バックグラウンドスレッドで実行する必要があることに注意してください。

http://developer.android.com/reference/android/app/Service.html#START_STICKY

于 2013-02-22T00:14:47.247 に答える
1

タスクマネージャーによってアプリが閉じられないようにできるかどうかは完全にはわかりません。考えてみれば、そうであることは理にかなっている。ユーザー入力に応答せず、タスク マネージャーによる強制終了にも応答しないアプリがあるとします。良くない。しかし、私はあなたと似たようなこの質問を見つけました。また、ここで説明されているように、システムにサービスを自動的に再起動させることもできます(そのページを「サービスを開始する」直前まで少し下にスクロールします)。

于 2012-05-20T08:16:32.220 に答える
0

Service別のプロセスで実行してみましょう。このブログには良いチュートリアルがあります。

android:processタグに属性を指定<Service>して、アプリを独自のプロセス内で実行することができます。

<service
android:name="MyServiceName"
android:process="my_process" 
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>
于 2012-05-23T18:54:27.137 に答える
-1

サービスの onDestroy イベントでサービスの再起動を試みることができます。いくつかのフラグを使用して、サービスがユーザーによって閉じられているか、強制的に閉じられているかを確認します。

onDestroy が毎回呼び出されるという保証はないことに注意してください。

于 2012-05-25T06:30:16.490 に答える