应用程序关闭时写入数据库

Writing to database when app is closed

我正在使用 gcm 聊天,我有一个 onMessageReceived() 方法可以接收消息,将它们保存在数据库中,然后向用户发送通知。

当应用处于 运行(或暂停 - 运行 在后台)时,这就是我在数据库中存储消息的方式:

private DBHelper mDbHelper;
mDbHelper = new DBHelper(MainApplication.getAppContext());
SQLiteDatabase db = mDbHelper.getWritableDatabase();

方法 getAppContext() 是我的主要 activity 中的静态方法,其中 returns 上下文。

一切正常。我收到一条消息,保存成功,并收到通知 (当应用程序处于 运行 或在后台时).

问题出在应用程序关闭时。我无法使用 MainApplication.getAppContext();,因为应用程序关闭时没有上下文。

也许我应该以其他方式传递上下文?


更新

最终,如果应用程序关闭,我将消息保存在服务器上,当用户打开它时,我从服务器获取它们,从那里删除它们,并将它们保存在用户的设备上。 (比如 queue pop 操作...)

如果有更好的方法请告诉我
查看已接受的答案...

创建一个扩展 Service 的 class 并在 onStartCommand() 方法中执行数据库操作。同时在 onMessageReceived.

启动服务

根据您的需要,您可以使用广播接收器。

首先,像下面这样创建一个广播接收器,

public class UpdateReceiver extends BroadcastReceiver {

    protected UpdateListener listener;

    public UpdateReceiver(UpdateListener listener) {

        this.listener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent == null || intent.getExtras() == null) {
            return;
        }
        if (intent.getBooleanExtra("message", false)) {
            listener.onMessage(intent.getStringExtra("messageText"));
        } 
    }

    public interface UpdateListener {


        public void onMessage(String message);

    }
}

然后让您的 MainActivity 实现这个接收器,例如

public class MainActivity implements UpdateReceiver.UpdateListener

并且你需要注册你的广播接收器,然后你可以在你的 MainActivity 中覆盖 onMessage 方法,你可以在那里接收你的消息。

所以你的主要 activity 看起来像,

public class MainActivity  implements UpdateReceiver.UpdateListener {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        UpdateReceiver  chatMessageReceiver = new UpdateReceiver (this);
            registerReceiver(chatMessageReceiver, new       IntentFilter("messagereceived"));



    }

@Override
    protected void onMessage( String message) {

//do your DB Operations

    }

}

在你的 onMessageReceived 方法中,像这样调用这个广播接收器,

        Intent intent = new Intent();
        intent.setAction("messagereceived");
        intent.putExtra("message", true);
        intent.putExtra("messageText", "your message")
        getApplicationContext().sendBroadcast(intent);

好的,所以 1 年后我再次需要它,我找到了答案:

原来 SQLiteOpenHelper 中有一个静态方法可以在没有上下文的情况下打开数据库:openDatabase().

所以替换这个:

mDbHelper = new DBHelper(MainApplication.getContext());
db = mDbHelper.getWritableDatabase();

有了这个:

db = SQLiteDatabase.openDatabase("path/to/database.db", null, OPEN_READWRITE);

静态方法openDatabase()不需要上下文,所以即使在应用程序关闭时我们也可以调用它。