わかりました、これは繰り返しの質問だと思います。申し訳ありません。Web からデータを収集して DB を更新し、データのダウンロード中にダイアログを表示する必要があります。私は自分のダイアログを持っています。データはうまくいき、データベースに書き込みます。私はいくつかの改善を行っています。今日、これは 1 つのアクティビティから機能します。私の意志は、これがすべてのアプリケーションで発生し、間隔を置いて開始することです。そして、これは問題が発生する瞬間です。AlertManager を使用してアクションのスケジュールを設定しています。データベースをチェックしてWebからデータを取得し始めるBroadcastReceiverがあります。この時点で、私は問題に直面しています。進行状況ダイアログが表示されず、データが完全に Web から取得されません。
BroadcastReceiver からのコード:
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
public class SchedulerUpdate extends BroadcastReceiver {
private Handler mHandler = null;
@Override
public void onReceive(Context context, Intent intent) {
try {
mHandler = new Handler();
Log.i("INFO", "SCHEDULED");
if(checkDataBase(context)){
updateData(context);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private boolean checkDataBase(Context context){
String path = "/data/data/"+context.getPackageName()+"/databases/mdsdacpdatabase.db";
SQLiteDatabase database = null;
boolean result = false;
try{
database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.CREATE_IF_NECESSARY);
database.close();
result = true;
}
catch(SQLiteException e){
}
return result;
}
private void updateData(final Context context) {
((Activity)context.getApplicationContext()).showDialog(ID_DIALOG_PROGRESS_DOWNLOAD);
Runnable runnable = new Runnable(){
public void run(){
Log.i("INFO", "RUNNING");
...
mHandler.post(new Runnable() {
public void run() {
((Activity)context).dismissDialog(ID_DIALOG_PROGRESS_DOWNLOAD);
Log.i("INFO", "DONE");
}
});
};
};
new Thread(runnable).start();
}
}
StackOverflow と Kam でこれらの投稿を読む:
BroadcastReceiver の AlertDialog
システムの再起動後にブロードキャスト レシーバーにアラート ダイアログを表示する
BroadcastReceiverからアンドロイドのアクティビティにデータを送信するには?
Android: サービスよりもアラームとインテント レシーバーを優先する<--Kam です
私の結論は次のとおりです。
- BroadcastReceivers はアクティビティではないため (Commonsware が指摘しているように) ダイアログを表示できません。
- BroadcastReceivers は、アプリをクラッシュさせる向きの問題を処理できません (onCreateDialog メソッドをオーバーライドするアクティビティでこれを修正します)。
- ハンドラは、BroadcastReceivers で使用するように指定されていません。
- サービスは、この種のタスクを実行するように指示されていません。
これを解決する方法を考えました。アクティビティから継承するクラスを作成し、オリエンテーションの問題を処理するクラスを作成し、ブロードキャストをスケジュールして、コンテンツをダウンロードし、ダイアログを表示します。そして、他のすべてのクラスはそれを継承します。この解決策は機能すると思いますが、問題を解決するための大きな回避策です。
私の質問が長すぎる場合は申し訳ありません。他のいくつかの解決策について話し合いたいと思います(私が提案したものが有効な解決策である場合、私はテストしていません)。