0

好的,我认为这是一个反复出现的问题,对此感到抱歉。我需要更新我的数据库,从网络收集一些数据并在下载数据时显示一个对话框。我有我的对话,数据很好并写入数据库。我正在做一些改进。今天,这从一个活动开始。我的意愿是这发生在所有应用程序中,并在一段时间后开始。这就是问题出现的时刻。我正在使用 AlertManager 来安排我的行动。我有一个 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 上的这些帖子:

Android中的广播接收器对话框问题

BroadcastReceiver 中的 AlertDialog

系统重新启动后在广播接收器中显示警报对话框

如何将数据从 BroadcastReceiver 发送到 android 中的 Activity?

Android:更喜欢警报和意图接收器而不是服务<--这是 Kam

我的结论是:

  • BroadcastReceivers 无法显示对话框,因为它们不是活动(如 Commonsware 指出的);
  • BroadcastReceivers 无法处理导致应用程序崩溃的方向问题(我在覆盖 onCreateDialog 方法的活动中解决了这个问题);
  • 处理程序未指示在广播接收器中使用;
  • 服务未指示执行此类任务;

我想了一个办法来解决这个问题。创建一个继承自活动的类,并在其中处理方向问题,在其中安排我的广播以在某个时间下载内容并显示对话框。所有其他类都继承自它。我认为这个解决方案有效,但它是解决问题的重要解决方法。

对不起,如果我的问题太长了。我想讨论一些其他的解决方案(如果我提出的是一个有效的解决方案,我没有测试)。

4

1 回答 1

0

BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。

这对你在 onReceive(Context, Intent) 实现中可以做的事情有重要的影响:任何需要异步操作的东西都不可用,因为你需要从函数返回来处理异步操作,但此时 BroadcastReceiver 是不再活动,因此系统可以在异步操作完成之前自由地终止其进程。

特别是,您可能不会在 BroadcastReceiver 中显示对话框或绑定到服务。对于前者,您应该改用 NotificationManager API。对于后者,您可以使用 Context.startService() 向服务发送命令。

来源:http: //developer.android.com/reference/android/content/BroadcastReceiver.html

于 2012-08-19T18:14:23.200 回答