Android memulai aktivitas dari layanan


151

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

Saya meluncurkan layanan ini dari Activity

Dalam Activityjika kondisi memenuhi memulai

startService(new Intent(WozzonActivity.this, LocationService.class));

dari yang saya LocationServicesebutkan di atas tidak dapat diluncurkan Activity, bagaimana saya bisa mendapatkan konteks saat ini berjalan Activitydi kelas layanan?

Jawaban:


344

Dari dalam kelas Layanan:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

17
Hanya FLAG_ACTIVITY_NEW_TASK yang diperlukan karena hanya aktivitas yang dapat memulai aktivitas tanpanya. 'this' dapat digunakan sebagai ganti getBaseContext dan getApplication karena layanan memiliki konteksnya sendiri.
Sojurn

1
Bagaimana cara menghapus aktivitas itu dari daftar layar terakhir secara terprogram?
Prashanth Debbadwar

2
Tidak berfungsi jika layanan di latar belakang. Adakah perbaikan untuk ini?
Rick Royd Aban

4
Tolong bantu saya untuk membuka aplikasi dari layanan latar belakang. Saya telah menggunakan layanan Firebase (FCM). Saya ingin membuka layar UI Panggilan Saya dari Aplikasi Saya Jadi tolong bantu saya untuk itu
Dipanki Jadav

2
Saya telah menulis kode Anda di dalam layanan saya ketika aplikasi di latar belakang, dan saya melihat bahwa layanan ini bekerja pada xiaomi mi a2, tetapi tidak bekerja pada xiaomi redmi note 7, dapatkah Anda membantu saya mengapa ini bekerja satu perangkat dan satu tidak?
Amjad Omari

18

Saya memiliki masalah yang sama, dan ingin memberi tahu Anda bahwa tidak ada yang di atas bekerja untuk saya. Apa yang berhasil untuk saya adalah:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

dan dalam satu subclass saya, disimpan dalam file terpisah saya harus:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

Semua jawaban lain memberi saya a nullpointerexception.


5
Anda menyimpan Layanan di bidang statis, yang dapat menyebabkan kebocoran memori
Murmel

1
startActivity sama dengan this.startActivity! Anda membuat instance yang tidak berguna dari layanan Anda dengan startActivity normal yang sama, mengapa?
Amir Hossein Ghasemi

8

Hal lain yang layak disebut: sementara jawaban di atas bekerja dengan baik ketika tugas kita ada di latar belakang, satu-satunya cara saya bisa membuatnya bekerja jika tugas kita (yang dibuat dari layanan + beberapa kegiatan) ada di latar depan (yaitu salah satu kegiatan kita terlihat kepada pengguna) seperti ini:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

Saya tidak tahu apakah ACTION_VIEW atau FLAG_ACTIVITY_NEW_TASK dapat digunakan di sini. Kunci sukses adalah

storedActivity.startActivity(intent);

dan tentu saja FLAG_ACTIVITY_REORDER_TO_FRONT untuk tidak membuat instance aktivitas lagi. Semoga berhasil!


1
Ini tidak bekerja. Semua ini memberi saya kesalahan "Memanggil startActivity () dari luar konteks Aktivitas membutuhkan bendera FLAG_ACTIVITY_NEW_TASK. Apakah ini yang Anda inginkan?"
Cerin

2
Ini karena panggilan kedua ke setFlag mengesampingkan panggilan pertama. Solusi ini harus menggunakan addFlags, atau satu panggilan untuk mengatur flag yang melewati Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac

8
Anda tidak ingin menggabungkan bendera dengan &&; Anda ingin menggunakan | (satu batang untuk bitwise atau)
Jon Watte

Intent intent = Intent baru (disimpanActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); disimpanActivity.startActivity (maksud);
Prakhar1001

1

seseorang tidak dapat menggunakan Contextdari Service; bisa mendapatkan (paket) yang Contextsama:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);

Saya pikir ini hanya berfungsi dengan FLAG_ACTIVITY_NEW_TASKbendera
Cerlin

0

Bergantian,

Anda dapat menggunakan kelas Aplikasi Anda sendiri dan menelepon dari mana pun Anda butuhkan (terutama non-kegiatan).

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

Dan daftarkan kelas Aplikasi Anda:

<application android:name="yourpackage.App" ...

Lalu hubungi:

App.getContext();

2
Berhati-hatilah dengan menggunakan contoh statis konteks, hal itu dapat menyebabkan kebocoran beberapa memor
crgarridos

1
@crgarridos Tidak. Ini adalah konteks Aplikasi yang sifatnya Singleton dan tidak akan menyebabkan kebocoran memori
GV_FiQst

1
Saya akan mengubah jalur context = getApplicationContext();kecontext = this;
GV_FiQst

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.