Pertanyaan Android GCM: cara penanganan yang berbeda tergantung apakah aplikasinya terlihat atau tidak


Saya punya beberapa kegiatan dan layanan niat yang menangani pesan masuk GCM.

Saat ini untuk setiap push, saya mengirim Pemberitahuan, dan setelah pengguna mengkliknya, dia diarahkan ke layar yang sesuai.

Saya ingin mengubah perilaku ini bahwa jika aplikasi terlihat (aktivitas apa pun ada di latar depan), alih-alih pemberitahuan, pesan dialog ditampilkan (dengan tindakan yang sesuai).

Tahu bagaimana mengimplementasikannya?

Saya punya 2 ide tetapi tidak ada yang sempurna:

  • Lacak setiap aktivitas dalam aplikasi, jika aktivitasnya terlihat, jangan tampilkan pemberitahuan, tetapi kirimkan niat ke aktivitas (bukan solusi yang bagus)
  • register / unregister penerima siaran kedua di setiap aktivitas onResume / onPause, "tangkap" siaran GCM yang masuk (saya tidak yakin apakah mungkin).

Ada solusi lain?


8
2018-04-07 10:45


asal


Jawaban:


Saya tidak mengujinya, tetapi dokumen mengatakan Anda bisa mendapatkan jumlah aktivitas yang sedang berjalan untuk setiap tugas.

Cobalah untuk menemukan tugas aplikasi Anda di antara tugas yang sedang berjalan:

ActivityManager acitivityManager = (ActivityManager) 
    context.getSystemService(Context.ACTIVITY_SERVICE);
// Get the top of running tasks, limit by 100
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100);
for (RunningTaskInfo taskInfo : tasks) {
    if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) {
        if (taskInfo.numRunning > 0) {
            // Show dialog
        } else {
            // Show notification
        }
        break;
    }
}

Google menambahkan catatan pada getRunningTasks():

Catatan: metode ini hanya ditujukan untuk debugging dan penyajian antarmuka pengguna manajemen tugas. Ini tidak boleh digunakan untuk logika inti dalam aplikasi, seperti memutuskan perilaku yang berbeda berdasarkan informasi yang ditemukan di sini. Penggunaan semacam itu tidak didukung, dan kemungkinan akan rusak di masa depan. Misalnya, jika beberapa aplikasi dapat berjalan secara aktif pada saat yang sama, asumsi yang dibuat tentang arti data di sini untuk tujuan aliran kontrol akan salah.

Jadi gunakan itu dengan resiko Anda sendiri.


Periksa juga apakah siaran GCM adalah dipesan. Jika demikian, Anda dapat "mengganti" default Anda BroadcastReceiver dengan yang lain di setiap Kegiatan. Mainkan saja dengan prioritas dari IntentFilters. Ketika BroadcastReceiver dengan prioritas yang lebih tinggi menerima pesan, itu bisa menggugurkan itu perbanyakan lebih lanjut. Untuk aplikasi Anda ini berarti ketika beberapa Activity sedang berjalan, itu mendaftar penerima yang menunjukkan dialog dan dibatalkan siaran. Jika tidak ada aktivitas yang aktif, maka penerima default Anda menunjukkan pemberitahuan.


1
2018-04-10 19:58



Solusi yang mungkin (gagasan 1):

Untuk mendeteksi apakah aplikasi Anda berjalan kembali atau latar depan, Anda cukup menetapkan boolean di onPause / onResume:

@Override
protected void onResume() {
  super.onResume();
  runningOnBackground = false;
}

@Override
protected void onPause() {
  super.onPause();
  runningOnBackground = true;
}

Ketika Anda memulai niat baru dari pemberitahuan, metode ini dipanggil: (jika Anda menggunakan singleTop), dengan boolean Anda dapat menentukan apa yang harus dilakukan dalam metode onNewIntent.

@Override
protected void onNewIntent (Intent intent){
  if(runningOnBackground){
    //do this
  }
  else{
    //do that
  }
}

Semoga itu membantu!


3
2018-04-07 11:51