2015-08-14 3 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

Лучше использовать в 'Service 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 (контекст контекста)' –

Смежные вопросы