Android如何在无法传递应用程序上下文时从广播接收器启动数据库操作
在我的应用程序中,当广播接收器执行它所执行的操作时,我也想启动一个数据库操作,但处理数据库操作的类需要一个DB singleton实例,我通常将其保存在应用程序对象中,无法通过服务上下文访问 发生的情况如下: 这是我的数据库处理程序:Android如何在无法传递应用程序上下文时从广播接收器启动数据库操作,android,Android,在我的应用程序中,当广播接收器执行它所执行的操作时,我也想启动一个数据库操作,但处理数据库操作的类需要一个DB singleton实例,我通常将其保存在应用程序对象中,无法通过服务上下文访问 发生的情况如下: 这是我的数据库处理程序: public class DatabaseManager extends SQLiteOpenHelper { // Its a good practice for DBTools to be a singleton. Do not instantiat
public class DatabaseManager extends SQLiteOpenHelper {
// Its a good practice for DBTools to be a singleton. Do not instantiate it with "new DBTools(context)" but with
// DBTools.getInstance(context) instead
private static DatabaseManager sInstance;
public SQLiteDatabase database;
public static DatabaseManager getInstance(Context context) {
if (sInstance == null) {
sInstance = new DatabaseManager(context);
}
return sInstance;
}
public DatabaseManager(Context context) {
super(context, Preferences.LOCAL_SQLITE_DATABASE_NAME, null, 1);
}
在我的应用程序类中,我采用以下方式进行设置:
// SQLite Database Handler
public DatabaseManager databaseManager;
@Override
public void onCreate() {
super.onCreate();
databaseManager = DatabaseManager.getInstance(this);
在我的接收器中,我要启动数据库操作:
public class PushNotificationReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//DatabaseManager databaseManager = DatabaseManager.getInstance(context); -> This didnt work when the database was closed in onDestroy of my app.
new IncrementProgressIntoDB(context, eventId).execute();
这是递增的ProgressInDB
public class IncrementProgressIntoDB extends AsyncTask<Void, Void, Boolean> {
private int eventId;
private Context context;
public IncrementProgressIntoDB(Context context, int eventId) {
this.context = context;
this.eventId= eventId;
}
@Override
protected Boolean doInBackground(Void... params) {
((MyApplication) context).databaseManager.database.beginTransaction();
我在这里尝试了解决方案:
但是我获取的上下文无法将databaseManager解析为字段。在您的广播接收器的onReceive()方法中,替换:
new IncrementProgressIntoDB(context, eventId).execute();
与:
试试这个。它应该可以工作。启动一个服务来执行sqlite操作直到现在我只能让推送通知与接收器一起工作。我想处理这个问题,然后开始处理一个服务,以便在电话重启后通知可以工作。尝试了这个方法,它通过了应用程序上下文,但现在我得到了一个数据库的NullPointerException,因为它在应用程序classI的onDestroy中被杀死。我将尝试在那里重新安装它
new IncrementProgressIntoDB(context, eventId).execute();
new IncrementProgressIntoDB((MyApplication)context.getApplicationContext(), eventId).execute();