2015-08-14 115 views
0

我使用gcm進行聊天,並且我有一個onMessageReceived()方法,它接收消息並將其保存在數據庫中,並向用戶發送通知。當應用程序關閉時寫入數據庫

當應用程序正在運行(或暫停 - 在後臺運行),這是我的信息存儲在數據庫中:

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

方法getAppContext()是我的主要活動中的靜態方法,它返回上下文。

這一切正常。我收到一條消息,保存成功,並獲得通知(當應用程序正在運行時,或在後臺)

問題是應用程序關閉時。我無法使用MainApplication.getAppContext();,因爲應用程序關閉時沒有上下文。

也許我應該以某種其他方式傳遞語境?


UPDATE

最後,我在服務器上保存的消息,如果應用程序被關閉,而當用戶打開它,我從服務器fetch'em,從那裏刪除,並保存用戶的設備上。 (如queue pop操作...)

讓我知道如果有一個更好的方法
看接受的答案...

+1

不如在'服務Context' –

+0

使用請擴大... –

回答

1

行,所以1年後我又需要這一點,我發現回答:

原來在SQLiteOpenHelper中有一個靜態方法,它打開沒有上下文的數據庫:openDatabase()

所以替換此:

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

與此:

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

openDatabase()不需要背景,所以我們可以把它叫做甚至當應用程序被關閉的靜態方法。

0

創建延伸Service類,並在onStartCommand()方法做你的數據庫操作。還在onMessageReceived開始服務。

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 

,你需要註冊你的廣播接收器,那麼你可以重寫的onMessage方法在你的MainActivity中,你可以在那裏收到你的消息。

所以你的主要活動將是什麼樣子,

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); 
+0

當應用程序運行時我收到的消息,不管我在什麼活動(我用'LocalBroadcastManager')。我成功保存併發送通知。問題只在應用程序關閉時出現。這會解決問題嗎?再次,我**接收**的消息 - 只是無法挽救他們。 –

+0

檢查我編輯的答案,這個廣播接收器將在收到消息時觸發,並且您可以將消息保存到數據庫,無論該應用程序是在後臺還是被終止。 –

+0

同樣,我已經有了這樣一個接收器。它正在工作。但我不能使用'DBHelper(Context context)' –

相關問題