应用程序关闭时写入数据库
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()
不需要上下文,所以即使在应用程序关闭时我们也可以调用它。
我正在使用 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()
不需要上下文,所以即使在应用程序关闭时我们也可以调用它。