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?

b-man
sumber

Jawaban:

344

Dari dalam kelas Layanan:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
b-man
sumber
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.

Andy
sumber
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!

Kellogs
sumber
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);
Martin Zeitler
sumber
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();
james
sumber
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
-1

Jika Anda perlu menghitung ulang suatu Aktivitas yang ada di bacgrounde, dari layanan Anda, saya sarankan tautan berikut. Intent.FLAG_ACTIVITY_NEW_TASK bukan solusi.

https://stackoverflow.com/a/8759867/1127429

GMG
sumber