意図サービスのためにクイズされているすべての保留中の意図をキャンセルするにはどうすればよいですか
-
27-10-2019 - |
質問
ユーザーとアプリによって自動的にクイックされるIntentserviceがあります。ユーザーがアプリケーションからログアウトしたときにクエードされたすべての保留中の意図を殺すことができる必要がありますが、それを機能させることはできません。 StopService()とStopSelf()を試しましたが、ユーザーがログアウトした後、意図がIntentserviceから発射し続けます。私は意図のIDを取得しようとしますが、Intentserviceが開始するたびに、Intent IDを保持する変数が空になっているため、それは困難です。これが私のIntentserviceコードです:
public class MainUploadIntentService extends IntentService {
private final String TAG = "MAINUPLOADINTSER";
private GMLHandsetApplication app = null;
private SimpleDateFormat sdf = null;
public boolean recStops = true;
public MainUploadIntentService() {
super("Main Upload Intent Service");
GMLHandsetApplication.writeToLogs(TAG,
"GMLMainUploadIntentService Constructor");
}
@Override
protected void onHandleIntent(Intent intent) {
GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Started");
if (app == null) {
app = (GMLHandsetApplication) getApplication();
}
uploadData(app);
GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Finished");
}
@Override
public void onDestroy() {
GMLHandsetApplication.writeToLogs(TAG, "onDestroy Started");
app = null;
stopSelf();
GMLHandsetApplication.writeToLogs(TAG, "onDestroy completed");
}
public void uploadData(GMLHandsetApplication appl) {
//All of my code that needs to be ran
}
解決
残念ながら、標準的なIntentserviceメソッドでそれを達成することは不可能だと思います。なぜなら、それはすでに進んでいる間にそれを中断する方法を提供しないからです。
あなたがあなたのニーズに合っているかどうかを確認することができると考えることができるいくつかのオプションがあります。
- Intentserviceコードをコピーして、保留中のメッセージを削除できる独自の変更を作成します。ここで誰かがそれで成功したように見えます: Android:Intentservice、HandleIntentキューでタスクを中止またはスキップする方法
- すべてのIntentserviceコードをコピーする代わりに、通常のサービスのようにバインドすることもできます(Intentserviceがサービスを拡張するため)。これはそのリンクでも言及されています。
- 代わりに、Intentserviceを通常のサービスとして書き直します。このオプションを使用すると、メッセージの追加と削除を制御することができます。
Intentserviceを使用しているのと同じような状況のように聞こえるものがあり、最終的には代わりにサービスに変換しました。それにより、私は同時にタスクを実行し、またそれらをクリアする必要があるときにそれらをキャンセルすることができました。
他のヒント
ここネイティブ(Android NDK)ハンドルをいつ解放する必要がありますか? それは HangAroundIntentService
メソッドがあるクラス cancelQueue()
。クラスにはメソッドもあります
public static Intent markedAsCancelIntent(Intent intent)
それは意図をキャンセルの意図に変換し、
public static boolean isCancelIntent(Intent intent)
.
クラスは、オープンソースのGoogleのコードに基づいています。
ただ考えているだけでなく、onhandleintentの内側には、アプリが実行されていないかどうかを確認するためにチェックする議論がありますか?例。アプリの開始時には、静的なvarを持つことができます
boolean appRunning;
次に、意図のハンドルで、ApprunningをFalseに設定したときに、アクティビティのオンポーズまたはオンデストロイの後に、OnhandLeintentコードをブール値に包むことができます。
protected void onHandleIntent(final Intent intent) {
if(MainActivity.appRunning){
...
}
}
ちょっとした考え