Jadi saya tidak yakin di mana / bagaimana menerapkan metode ini untuk membuat layanan saya berjalan di latar depan. Saat ini saya memulai layanan saya dengan mengikuti di aktivitas lain:
Intent i = new Intent(context, myService.class);
context.startService(i);
Dan kemudian di myServices 'onCreate () saya mencoba startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Jadi ya saya agak bingung dan tidak yakin bagaimana menerapkan ini.
Jawaban:
Saya akan mulai dengan mengisi file
Notification
. Berikut adalah contoh proyek yang mendemonstrasikan penggunaanstartForeground()
.sumber
1337
?Dari aktivitas utama Anda, mulai layanan dengan kode berikut:
Kemudian dalam layanan
onCreate()
Anda untuk Anda akan membuat notifikasi dan menyetelnya sebagai latar depan seperti:sumber
Ini adalah kode saya untuk mengatur layanan ke latar depan:
Saya perlu membuat notifikasi menggunakan PendingIntent, sehingga saya bisa memulai aktivitas utama saya dari notifikasi tersebut.
Untuk menghapus notifikasi, cukup panggil stopForeground (true);
Ini dipanggil di onStartCommand (). Silakan merujuk ke kode saya di: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
sumber
Intent.FLAG_ACTIVITY_NEW_TASK
tidak valid dalam konteksPendingIntent
.Solusi untuk Oreo 8.1
Saya mengalami beberapa masalah seperti RemoteServiceException karena ID saluran tidak valid dengan versi Android terbaru. Beginilah cara saya menyelesaikannya:
Aktivitas :
BackgroundService:
SETARA JAWA
sumber
ContextCompat.startForegroundService(Context,Intent)
dalam Aktivitas Anda yang akan melakukan hal yang benar. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
daripadaNotification.CATEGORY_SERVICE
jika min API Anda <21Build.VERSION_CODES.P
(API level 28) atau yang lebih baru harus meminta izinManifest.permission.FOREGROUND_SERVICE
untuk menggunakanstartForeground()
- lihat developer.android.com/reference/android/app/…Selain jawaban RAWA , kode damai ini:
Anda dapat mengubah ke:
Jika Anda akan melihat ke dalam metode ini maka Anda dapat melihat bahwa metode ini melakukan semua pekerjaan pemeriksaan untuk Anda.
sumber
Jika Anda ingin menjadikan IntentService sebagai Layanan Latar Depan
maka Anda harus menimpa
onHandleIntent()
seperti iniBagaimana cara membuat notifikasi?
sederhana. Inilah
getNotification()
MetodenyaPemahaman Lebih Dalam
Apa yang terjadi saat layanan menjadi layanan latar depan
Apa itu Layanan Latar Depan?
Sebuah layanan latar depan,
memastikan bahwa pengguna secara aktif mengetahui bahwa ada sesuatu yang terjadi di latar belakang dengan memberikan notifikasi.
(yang terpenting) tidak dimatikan oleh Sistem saat memori hampir habis
Kasus penggunaan layanan latar depan
Menerapkan fungsionalitas pengunduhan lagu di Aplikasi Musik
sumber
Tambahkan kode yang diberikan Kelas layanan untuk "OS> = Build.VERSION_CODES.O" di onCreate ()
Tambahkan izin ini di file manifes:
sumber
Tangani maksud pada startCommand layanan dengan menggunakan.
Panggilan ini akan menghapus layanan dari keadaan latar depan , sehingga memungkinkan untuk dimatikan jika diperlukan lebih banyak memori. Ini tidak menghentikan layanan dari berjalan. Untuk itu, Anda perlu memanggil stopSelf () atau metode terkait.
Passing value true or false ditunjukkan jika Anda ingin menghapus notifikasi atau tidak.
Menangani tugas Anda saat dihancurkan dipanggil oleh stopSelf () .
Buat notifikasi untuk menjaga layanan tetap berjalan di latar depan.
Berikan tombol stop pada notifikasi untuk menghentikan layanan saat pengguna membutuhkan.
sumber
Catatan: Jika aplikasi Anda menargetkan API level 26 atau lebih tinggi, sistem akan memberlakukan batasan pada penggunaan atau pembuatan layanan latar belakang kecuali jika aplikasi itu sendiri berada di latar depan.
Jika suatu aplikasi perlu membuat layanan latar depan, aplikasi tersebut harus memanggil
startForegroundService()
. Metode itu membuat layanan latar belakang, tetapi metode memberi sinyal ke sistem bahwa layanan akan mempromosikan dirinya sendiri ke latar depan.Setelah layanan dibuat, layanan harus memanggilnya
startForeground() method within five seconds.
sumber
startForegroundService
metodeDalam kasus saya Ini sangat berbeda karena saya tidak memiliki aktivitas untuk meluncurkan layanan di Oreo.
Berikut adalah langkah-langkah yang saya gunakan untuk menyelesaikan masalah layanan latar depan ini -
Dan setelah itu untuk memulai layanan ini saya memicu di bawah cmd -
adb -s "+ serial_id +" shell am startforegroundservice -n com.test.socket.sample / .SocketService
Jadi ini membantu saya memulai layanan tanpa aktivitas di perangkat Oreo :)
sumber
Solusi @mikebertiean hampir berhasil, tetapi saya memiliki masalah ini dengan twist tambahan - saya menggunakan sistem Gingerbread dan saya tidak ingin menambahkan beberapa paket tambahan hanya untuk menjalankan notifikasi. Akhirnya saya menemukan: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
kemudian saya mengalami masalah tambahan - pemberitahuan hanya mematikan aplikasi saya ketika berjalan (cara mengatasi masalah ini: Android: Bagaimana menghindari mengklik pada panggilan Pemberitahuan onCreate () ), jadi secara total kode saya dalam layanan terlihat seperti ini (C # / Xamarin):
sumber