0

ユーザーがアプリを開くたびに、新しい記事とその詳細なストーリーをダウンロードする必要があるニュースアプリを設計しています。私はこれをすべてバックグラウンドスレッドで行っています。私の主な焦点は、ユーザーが追加のダウンロード料金を負担するのを防ぐために、ユーザーがアプリを終了するとすぐにバックグラウンド スレッドを停止することでした。

これを実現するために、スプラッシュ スクリーンでバックグラウンド ダウンロードを開始し、アプリがまだ実行されているかどうかをバックグラウンド プロセスに知らせるフラグ変数をチェックし続けます。

私の質問は次のとおりです。このフラグ変数の初期化については非常に明確です。アプリケーションの開始点であるためonCreate()、サブクラスで初期化しました。Applicationでもどこをクリアしたらいいのかわからない。onDestroy()MainActivityでやってみました。ただし、システムがメモリを解放する必要がonDestroy()ある場合、あるアクティビティから別のアクティビティへの移行時に呼び出されることがよくあり ます。そのため、画面を切り替えて実際にアプリを閉じていなくても、バックグラウンド スレッドが停止してしまいます。このシナリオにどのように対処すればよいですか? これを処理するよりスマートな方法はありますか?

4

3 に答える 3

0
But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.

ユーザーが (Back で) 終了したためにアクティビティが破棄されたのか、それとも Android がアクティビティを再作成するのかを知るには、isFinishing()を使用できます。何かのようなもの:

protected void onDestroy() {
 super.onDestroy();
 if(isFinishing()) {
 // stop the news feed download
}
}

または、次の場所でフィードのダウンロードを停止しますfinish()

public void finish() {
  // stop the news feed download
  super.finish();
}

あなたが上で言ったことに戻るには:

I'm very clear about initialization of this flag variable. I've initialized it in onCreate() of Application subclass since it is the point where application starts.

活動が終了したとしても、アプリケーションは存続する可能性が非常に高いです。Android OS は、いつそれを強制終了するかを決定します。したがって、アプリが起動したらダウンロードを初期化し、必要に応じてアクティビティ内onDestroy()またはfinish()アクティビティ内で停止しますが、アプリケーションが停止せず (可能性が最も高い)、ニュースに再び入る場合ニュースのダウンロードを開始する必要があります。

ではバックグラウンドでダウンロードを開始したいのですonCreate(Bundle savedInstance)が、 whensavedInstanceが null であるため (これがこのアクティビティの最初の作成であることはわかっています)、 で停止します (まだ停止していない場合) finish()

それが役に立てば幸い!

于 2013-06-12T09:16:31.593 に答える
-1

まず、Web サービス (json または xml) からデータをダウンロードするには、AsyncTask (使いやすい) を使用する必要があります。

つまり、アプリケーションが終了したときに ondestroy() でフラグをクリアすると、ホームボタンが押されたときにキャッチできる可能性があります

アクティビティで以下のメソッドをオーバーライドし、

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

そして、キーイベントを次のように処理します。

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        //do something
    }
    if(keyCode==KeyEvent.KEYCODE_BACK)
    {
        //do something
        finish();
    }
    return false;
}
于 2013-06-12T08:58:08.310 に答える