我正在使用gcm
进行聊天,我有onMessageReceived()
方法接收消息,将其保存在数据库中,并向用户发送通知。
当应用程序运行(或暂停 - 在后台运行)时,这就是我将消息存储在数据库中的方式:
private DBHelper mDbHelper;
mDbHelper = new DBHelper(MainApplication.getAppContext());
SQLiteDatabase db = mDbHelper.getWritableDatabase();
方法getAppContext()
是我的主要活动中的静态方法,它返回上下文。
这一切都有效。我收到一条消息,成功保存并收到通知(当应用正在运行时或在后台运行时)。
问题是关闭应用程序的时间。我无法使用MainApplication.getAppContext();
,因为应用关闭时没有上下文。
也许我应该以其他方式传递上下文?
<击>的更新 撞击>
<击>最后,如果应用程序关闭,我在服务器上保存了消息,当用户打开它时,我从服务器获取,从那里删除它们,并将它们保存在用户的设备上。 (比如queue pop
操作......)
让我知道是否有更好的方法
看到接受的答案......
答案 0 :(得分:1)
好一年后我再次需要这个,我找到了答案:
在SQLiteOpenHelper
中有一个静态方法可以在没有上下文的情况下打开数据库:openDatabase()
。
所以替换这个:
mDbHelper = new DBHelper(MainApplication.getContext());
db = mDbHelper.getWritableDatabase();
用这个:
db = SQLiteDatabase.openDatabase("path/to/database.db", null, OPEN_READWRITE);
静态方法openDatabase()
不需要上下文,因此即使应用关闭,我们也可以调用它。
答案 1 :(得分:0)
创建一个扩展Service
的类,并在onStartCommand()
方法中执行数据库操作。同时在onMessageReceived
。
答案 2 :(得分:0)
根据您的需要,您可以使用广播接收器。
首先,创建一个如下所示的广播接收器,
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方法,然后您就可以在那里收到消息。
所以你的主要活动看起来像,
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);