Android: Bagaimana saya bisa mendapatkan aktivitas latar depan saat ini (dari layanan)?

180

Apakah ada cara android asli untuk mendapatkan referensi ke Aktivitas yang sedang berjalan dari layanan?

Saya memiliki layanan yang berjalan di latar belakang, dan saya ingin memperbarui Aktivitas saya saat ini ketika suatu peristiwa terjadi (dalam layanan). Apakah ada cara mudah untuk melakukan itu (seperti yang saya sarankan di atas)?

George
sumber
mungkin ini bisa memberi Anda ide stackoverflow.com/a/28423385/185022
AZ_

Jawaban:

87

Apakah ada cara android asli untuk mendapatkan referensi ke Aktivitas yang sedang berjalan dari layanan?

Anda mungkin tidak memiliki "Aktivitas yang sedang berjalan".

Saya memiliki layanan yang berjalan di latar belakang, dan saya ingin memperbarui Aktivitas saya saat ini ketika suatu peristiwa terjadi (dalam layanan). Apakah ada cara mudah untuk melakukan itu (seperti yang saya sarankan di atas)?

  1. Kirim siaran Intentke aktivitas - ini adalah contoh proyek yang menunjukkan pola ini
  2. Mintalah kegiatan menyediakan PendingIntent(misalnya, melalui createPendingResult()) yang diminta oleh layanan
  3. Mintalah aktivitas mendaftarkan panggilan balik atau objek pendengar melalui layanan melalui bindService() , dan minta layanan memanggil metode peristiwa pada objek panggilan balik / pendengar itu
  4. Kirim siaran yang dipesan Intentke aktivitas, dengan prioritas rendah BroadcastReceiversebagai cadangan (untuk menaikkan Notificationjika aktivitas tidak ada di layar) - di sini ada posting blog dengan lebih banyak tentang pola ini
CommonsWare
sumber
3
Terima kasih, tetapi karena saya memiliki banyak kegiatan, dan tidak ingin memperbarui semuanya, saya mencari cara android untuk mendapatkan foregroundActivity. Seperti yang Anda katakan, saya seharusnya tidak bisa melakukan itu. Berarti aku harus menyelesaikan ini.
George
1
@ George: Apa yang Anda inginkan tidak akan membantu Anda. Saat Anda menunjukkan, Anda memiliki "banyak kegiatan". Karenanya, itu semua adalah kelas yang terpisah. Karenanya, tidak ada layanan yang dapat Anda lakukan dengan mereka tanpa blok if-besar instanceofcek atau refactoring kegiatan untuk berbagi superclass atau antarmuka umum. Dan jika Anda akan memperbaiki kegiatan, Anda mungkin melakukannya dengan cara yang lebih sesuai dengan kerangka kerja dan mencakup lebih banyak skenario, seperti tidak ada kegiatan Anda yang aktif. # 4 mungkin yang paling tidak bekerja dan paling fleksibel.
CommonsWare
2
Terima kasih, tetapi saya punya solusi yang lebih baik. Semua aktivitas saya memperluas kelas BaseActivity yang disesuaikan. Saya telah menetapkan ContextRegister yang mendaftarkan aktivitas sebagai saat ini setiap kali di latar depan, dengan 3 baris literal di kelas BaseActivity saya. Tetap saja, terima kasih atas dukungannya.
George
3
@ George: Hati-hati dengan kebocoran memori. Anggota data statis yang dapat diubah harus dihindari di Jawa sedapat mungkin.
CommonsWare
Saya telah meringkas objek dengan erat, meskipun saya memang akan mengingatnya. Terima kasih.
George
139

Pembaruan : ini tidak lagi berfungsi dengan aktivitas aplikasi lain pada Android 5.0


Berikut cara yang baik untuk melakukannya menggunakan pengelola aktivitas. Pada dasarnya Anda mendapatkan runningTasks dari manajer aktivitas. Itu akan selalu mengembalikan tugas yang sedang aktif terlebih dahulu. Dari sana Anda bisa mendapatkan TopActivity.

Contoh di sini

Ada cara mudah untuk mendapatkan daftar tugas yang berjalan dari layanan ActivityManager. Anda dapat meminta jumlah tugas maksimum yang berjalan di telepon, dan secara default, tugas yang aktif dikembalikan terlebih dahulu.

Setelah Anda memilikinya, Anda bisa mendapatkan objek ComponentName dengan meminta topActivity dari daftar Anda.

Ini sebuah contoh.

    ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
    Log.d("topActivity", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName());
    ComponentName componentInfo = taskInfo.get(0).topActivity;
    componentInfo.getPackageName();

Anda memerlukan izin berikut pada manifes Anda:

<uses-permission android:name="android.permission.GET_TASKS"/>
Nelson Ramirez
sumber
3
Jawaban Anda 100% benar. Kanxx 4 itu. Lebih baik Anda mengirim jawaban yang sama di sini
Shahzad Imam
1
@ArtOfWarfare belum memverifikasi tetapi ya, jumlah fragmen yang Anda miliki tidak relevan karena selalu di-host oleh satu aktivitas.
Nelson Ramirez
2
Jika saya membutuhkan aktivitas saat ini lebih sering, saya harus melakukan polling sangat sering bukan? Apakah ada cara untuk mendapatkan acara callback setiap kali aktivitas latar depan berubah?
nizam.sp
43
Supaya semua orang sadar, dokumen menyatakan ini tentang metode getRunningTasks (). -------- Catatan: metode ini hanya dimaksudkan untuk debugging dan menyajikan antarmuka pengguna manajemen tugas. Ini tidak boleh digunakan untuk logika inti dalam aplikasi, seperti memutuskan antara perilaku yang berbeda berdasarkan informasi yang ditemukan di sini. Penggunaan tersebut tidak didukung, dan kemungkinan akan pecah di masa depan. Misalnya, jika beberapa aplikasi dapat aktif berjalan pada saat yang sama, asumsi yang dibuat tentang arti data di sini untuk keperluan aliran kontrol akan salah. ------------
Ryan
30
semifake on api 21As of LOLLIPOP, this method is no longer available to third party applications: the introduction of document-centric recents means it can leak person information to the caller. For backwards compatibility, it will still return a small subset of its data: at least the caller's own tasks, and possibly some other tasks such as home that are known to not be sensitive.
sherpya
116

Peringatan: Pelanggaran Google Play

Google telah mengancam akan menghapus aplikasi dari Play Store jika mereka menggunakan layanan aksesibilitas untuk tujuan non-aksesibilitas. Namun, ini dilaporkan sedang dipertimbangkan kembali .


Gunakan sebuah AccessibilityService

Manfaat

  • Diuji dan bekerja di Android 2.2 (API 8) hingga Android 7.1 (API 25).
  • Tidak memerlukan polling.
  • Tidak memerlukan GET_TASKSizin.

Kekurangan

  • Setiap pengguna harus mengaktifkan layanan di pengaturan aksesibilitas Android.
  • Ini tidak 100% dapat diandalkan. Kadang-kadang acara tidak berjalan dengan baik.
  • Layanan selalu berjalan.
  • Ketika pengguna mencoba untuk mengaktifkan AccessibilityService, mereka tidak dapat menekan tombol OK jika aplikasi telah meletakkan overlay pada layar. Beberapa aplikasi yang melakukan ini adalah Velis Auto Brightness dan Lux. Ini bisa membingungkan karena pengguna mungkin tidak tahu mengapa mereka tidak bisa menekan tombol atau cara mengatasinya.
  • Mereka AccessibilityServicetidak akan mengetahui aktivitas saat ini sampai perubahan aktivitas pertama.

Contoh

Layanan

public class WindowChangeDetectingService extends AccessibilityService {

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();

        //Configure these here for compatibility with API 13 and below.
        AccessibilityServiceInfo config = new AccessibilityServiceInfo();
        config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

        if (Build.VERSION.SDK_INT >= 16)
            //Just in case this helps
            config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

        setServiceInfo(config);
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            if (event.getPackageName() != null && event.getClassName() != null) {
                ComponentName componentName = new ComponentName(
                    event.getPackageName().toString(),
                    event.getClassName().toString()
                );

                ActivityInfo activityInfo = tryGetActivity(componentName);
                boolean isActivity = activityInfo != null;
                if (isActivity)
                    Log.i("CurrentActivity", componentName.flattenToShortString());
            }
        }
    }

    private ActivityInfo tryGetActivity(ComponentName componentName) {
        try {
            return getPackageManager().getActivityInfo(componentName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }
    }

    @Override
    public void onInterrupt() {}
}

AndroidManifest.xml

Gabungkan ini ke manifes Anda:

<application>
    <service
        android:label="@string/accessibility_service_name"
        android:name=".WindowChangeDetectingService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService"/>
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibilityservice"/>
    </service>
</application>

Info Layanan

Masukkan ini res/xml/accessibilityservice.xml:

<?xml version="1.0" encoding="utf-8"?>
<!-- These options MUST be specified here in order for the events to be received on first
 start in Android 4.1.1 -->
<accessibility-service
    xmlns:tools="http://schemas.android.com/tools"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagIncludeNotImportantViews"
    android:description="@string/accessibility_service_description"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:ignore="UnusedAttribute"/>

Mengaktifkan Layanan

Setiap pengguna aplikasi harus mengaktifkan secara eksplisit agar aplikasi AccessibilityServicetersebut dapat digunakan. Lihat jawaban StackOverflow ini untuk cara melakukan ini.

Perhatikan bahwa pengguna tidak akan dapat menekan tombol OK ketika mencoba mengaktifkan layanan aksesibilitas jika aplikasi telah meletakkan overlay pada layar, seperti Velis Auto Brightness atau Lux.

Sam
sumber
1
@lovemint, apa yang saya maksudkan adalah: Saya ditentukan contoh settingsActivitydari your.app.ServiceSettingsActivity, sehingga Anda harus mengubah itu untuk aktivitas pengaturan Anda sendiri untuk layanan aksesibilitas Anda. Saya pikir aktivitas pengaturan adalah opsional, jadi saya telah menghapus bagian itu dari jawaban saya untuk membuatnya lebih sederhana.
Sam
1
Terima kasih banyak, hanya pertanyaan terakhir. Jika saya harus berurusan dengan API 8 hingga saat ini saya harus melakukan itu dalam kode alih-alih menggunakan XML?
paolo2988
1
@lovemint, itu benar. Saya baru saja memperbarui kode contoh untuk melakukan ini.
Sam
1
@ Sam, saya dapat mengonfirmasi bahwa Layanan ini berfungsi dengan baik. Satu perilaku aneh, saya menggunakan maksud dalam aktivitas utama untuk mengaktifkan Layanan Aksesibilitas. Setelah aktivasi pertama ini, layanan itu diaktifkan tetapi onAccessibilityEventtidak menerima peristiwa apa pun, tetapi jika saya menonaktifkan, dan mengaktifkan kembali Layanan Aksesibilitas, layanan itu diaktifkan kembali dan onAccessibilityEventmulai berfungsi.
paolo2988
2
Terima kasih atas kodenya. Saya membuat aplikasi ini untuk Anda :)
lemari besi
20

Itu bisa dilakukan dengan:

  1. Laksanakan kelas aplikasi Anda sendiri, daftar untuk ActivityLifecycleCallbacks - dengan cara ini Anda dapat melihat apa yang terjadi dengan aplikasi kami. Pada setiap saat melanjutkan, panggilan balik menetapkan aktivitas yang terlihat saat ini di layar dan pada jeda itu menghapus tugas. Itu menggunakan metode registerActivityLifecycleCallbacks()yang ditambahkan dalam API 14.

    public class App extends Application {
    
    private Activity activeActivity;
    
    @Override
    public void onCreate() {
        super.onCreate();
        setupActivityListener();
    }
    
    private void setupActivityListener() {
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {
                activeActivity = activity;
            }
            @Override
            public void onActivityPaused(Activity activity) {
                activeActivity = null;
            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }
    
    public Activity getActiveActivity(){
        return activeActivity;
    }
    
    }
  2. Dalam panggilan layanan Anda getApplication()dan berikan ke nama kelas aplikasi Anda (Aplikasi dalam hal ini). Daripada Anda dapat menelepon app.getActiveActivity()- yang akan memberi Anda Aktivitas yang terlihat saat ini (atau nol saat tidak ada aktivitas yang terlihat). Anda bisa mendapatkan nama Kegiatan dengan meneleponactiveActivity.getClass().getSimpleName()

Vit Veres
sumber
1
Saya mendapatkan eksekusi Nullpointer di activeActivity.getClass (). GetSimpleName (). Dapatkah Anda membantu
pemula
Seperti yang dapat Anda lihat dari ActivityLifecycleCallbacks - jika aktivitas tidak terlihat, application.getActiveActivity () mengembalikan nol. Itu berarti tidak ada aktivitas yang terlihat. Anda perlu memeriksa ini di layanan Anda atau di mana pun Anda menggunakan ini.
Vit Veres
ok..tapi kalau-kalau aktivitas dilanjutkan maka ini tidak boleh kembali nol ?? Aktivitas saya telah diluncurkan dan dalam resume saya mendapat
pemula
Sulit ditebak, coba letakkan breakpoints di onActivityResumed(), onActivityPaused()dan getActiveActivity()untuk melihat bagaimana itu callet, jika pernah begitu.
Vit Veres
@beginner satu harus memeriksa apakah activitydan activeActivityyang sama sebelum menugaskan activeActivitydengan nulluntuk kesalahan menghindari karena agar memanggil bercampur metode siklus hidup berbagai kegiatan.
Rahul Tiwari
16

Saya tidak dapat menemukan solusi yang akan membuat tim kami senang, jadi kami menggulung sendiri. Kami menggunakan ActivityLifecycleCallbacksuntuk melacak aktivitas saat ini dan kemudian mengeksposnya melalui layanan:

public interface ContextProvider {
    Context getActivityContext();
}

public class MyApplication extends Application implements ContextProvider {
    private Activity currentActivity;

    @Override
    public Context getActivityContext() {
         return currentActivity;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                MyApplication.this.currentActivity = activity;
            }

            @Override
            public void onActivityStarted(Activity activity) {
                MyApplication.this.currentActivity = activity;
            }

            @Override
            public void onActivityResumed(Activity activity) {
                MyApplication.this.currentActivity = activity;
            }

            @Override
            public void onActivityPaused(Activity activity) {
                MyApplication.this.currentActivity = null;
            }

            @Override
            public void onActivityStopped(Activity activity) {
                // don't clear current activity because activity may get stopped after
                // the new activity is resumed
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                // don't clear current activity because activity may get destroyed after
                // the new activity is resumed
            }
        });
    }
}

Kemudian konfigurasikan wadah DI Anda untuk mengembalikan instance MyApplicationuntuk ContextProvider, misalnya

public class ApplicationModule extends AbstractModule {    
    @Provides
    ContextProvider provideMainActivity() {
        return MyApplication.getCurrent();
    }
}

(Perhatikan bahwa implementasi getCurrent()dihilangkan dari kode di atas. Itu hanya variabel statis yang ditetapkan dari konstruktor aplikasi)

Muxa
sumber
4
salah satu harus memeriksa apakah activitydan currentActivityyang sama sebelum menugaskan currentActivitydengan nulluntuk kesalahan menghindari karena agar memanggil bercampur metode siklus hidup berbagai kegiatan.
Rahul Tiwari
14

Menggunakan ActivityManager

Jika Anda hanya ingin mengetahui aplikasi yang berisi aktivitas saat ini, Anda dapat melakukannya menggunakan ActivityManager. Teknik yang dapat Anda gunakan tergantung pada versi Android:

Manfaat

  • Harus bekerja di semua versi Android hingga saat ini.

Kekurangan

  • Tidak berfungsi di Android 5.1+ (hanya mengembalikan aplikasi Anda sendiri)
  • Dokumentasi untuk API ini mengatakan mereka hanya dimaksudkan untuk debugging dan manajemen antarmuka pengguna.
  • Jika Anda menginginkan pembaruan waktu nyata, Anda perlu menggunakan polling.
  • Bergantung pada API tersembunyi: ActivityManager.RunningAppProcessInfo.processState
  • Implementasi ini tidak mengambil aktivitas pengalih aplikasi.

Contoh (berdasarkan kode KNaito )

public class CurrentApplicationPackageRetriever {

    private final Context context;

    public CurrentApplicationPackageRetriever(Context context) {
        this.context = context;
    }

    public String get() {
        if (Build.VERSION.SDK_INT < 21)
            return getPreLollipop();
        else
            return getLollipop();
    }

    private String getPreLollipop() {
        @SuppressWarnings("deprecation")
        List<ActivityManager.RunningTaskInfo> tasks =
            activityManager().getRunningTasks(1);
        ActivityManager.RunningTaskInfo currentTask = tasks.get(0);
        ComponentName currentActivity = currentTask.topActivity;
        return currentActivity.getPackageName();
    }

    private String getLollipop() {
        final int PROCESS_STATE_TOP = 2;

        try {
            Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");

            List<ActivityManager.RunningAppProcessInfo> processes =
                activityManager().getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo process : processes) {
                if (
                    // Filters out most non-activity processes
                    process.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                    &&
                    // Filters out processes that are just being
                    // _used_ by the process with the activity
                    process.importanceReasonCode == 0
                ) {
                    int state = processStateField.getInt(process);

                    if (state == PROCESS_STATE_TOP) {
                        String[] processNameParts = process.processName.split(":");
                        String packageName = processNameParts[0];

                        /*
                         If multiple candidate processes can get here,
                         it's most likely that apps are being switched.
                         The first one provided by the OS seems to be
                         the one being switched to, so we stop here.
                         */
                        return packageName;
                    }
                }
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        return null;
    }

    private ActivityManager activityManager() {
        return (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

}

Nyata

Tambahkan GET_TASKSizin ke AndroidManifest.xml:

<!--suppress DeprecatedClassUsageInspection -->
<uses-permission android:name="android.permission.GET_TASKS" />
Sam
sumber
10
ini tidak berfungsi di Android M lagi. getRunningAppProcesses () sekarang hanya mengembalikan paket aplikasi Anda
Lior Iluz
1
Tidak berfungsi untuk API Level 22 (Android 5.1) juga. Diuji pada Build LPB23
sumitb.mdi
9

Saya menggunakan ini untuk tes saya. Itu API> 19, dan hanya untuk aktivitas aplikasi Anda.

@TargetApi(Build.VERSION_CODES.KITKAT)
public static Activity getRunningActivity() {
    try {
        Class activityThreadClass = Class.forName("android.app.ActivityThread");
        Object activityThread = activityThreadClass.getMethod("currentActivityThread")
                .invoke(null);
        Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
        activitiesField.setAccessible(true);
        ArrayMap activities = (ArrayMap) activitiesField.get(activityThread);
        for (Object activityRecord : activities.values()) {
            Class activityRecordClass = activityRecord.getClass();
            Field pausedField = activityRecordClass.getDeclaredField("paused");
            pausedField.setAccessible(true);
            if (!pausedField.getBoolean(activityRecord)) {
                Field activityField = activityRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                return (Activity) activityField.get(activityRecord);
            }
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    throw new RuntimeException("Didn't find the running activity");
}
espinchi
sumber
Ganti ArrayMap oleh Map dan itu akan bekerja pada 4.3 juga. Tidak diuji versi Android sebelumnya.
Oliver Jonas
2

Gunakan kode ini untuk API 21 atau lebih tinggi. Ini bekerja dan memberikan hasil yang lebih baik dibandingkan dengan jawaban lain, ia mendeteksi dengan sempurna proses latar depan.

if (Build.VERSION.SDK_INT >= 21) {
    String currentApp = null;
    UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
    long time = System.currentTimeMillis();
    List<UsageStats> applist = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
    if (applist != null && applist.size() > 0) {
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
        for (UsageStats usageStats : applist) {
            mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);

        }
        if (mySortedMap != null && !mySortedMap.isEmpty()) {
            currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
        }
    }
Manish Godhani
sumber
Bisakah Anda jelaskan bagaimana hasil dari metode ini lebih baik daripada jawaban lainnya?
Sam
Apakah ini berfungsi dengan Notification Menu juga. Saya menghadapi masalah ketika saya menerima telepon atau pesan. UsageStatsManager mulai memberi saya nama paket systemUi alih-alih aplikasi saya.
kukroid
@kukroid, poskan pertanyaan terpisah dan sertakan kode sumber, informasi perangkat, dan aplikasi perpesanan & telepon yang Anda gunakan.
Sam
0

Inilah jawaban saya yang berfungsi dengan baik ...

Anda seharusnya bisa mendapatkan Aktivitas saat ini dengan cara ini ... Jika Anda menyusun aplikasi Anda dengan beberapa Aktivitas dengan banyak fragmen dan Anda ingin melacak apa Aktivitas Anda saat ini, itu akan membutuhkan banyak pekerjaan. Senario saya adalah saya memiliki satu Kegiatan dengan beberapa Fragmen. Jadi saya bisa melacak Aktivitas Terkini melalui Objek Aplikasi, yang dapat menyimpan semua variabel Global saat ini.

Inilah caranya. Ketika Anda memulai aktivitas Anda, Anda menyimpan aktivitas itu dengan Application.setCurrentActivity (getIntent ()); Aplikasi ini akan menyimpannya. Di kelas layanan Anda, Anda bisa melakukannya seperti Intent currentIntent = Application.getCurrentActivity (); getApplication (). startActivity (currentIntent);

John3328
sumber
2
Ini mengasumsikan bahwa layanan berjalan dalam proses yang sama dengan Kegiatan, bukan?
helleye
0

Saya tidak tahu apakah ini jawaban yang bodoh, tetapi menyelesaikan masalah ini dengan menyimpan bendera di preferensi bersama setiap kali saya memasukkan onCreate () dari aktivitas apa pun, lalu saya menggunakan nilai dari preferensi terpusat untuk mencari tahu apa itu aktivitas latar depan.

Vlad Vladescu
sumber
1
Kami mencari cara asli untuk melakukannya
IgniteCoders
-3

Baru-baru ini mengetahui tentang ini. Dengan apis sebagai:

  • minSdkVersion 19
  • targetSdkVersion 26

    ActivityManager.getCurrentActivity (konteks)

Semoga ini ada gunanya.

pengguna3709410
sumber
1
Apakah harapan saya naik. Mungkin ketika ini dijawab itu ada, tetapi sampai sekarang tidak ada getCurrentActivity()fungsi di ActivityManagerkelas ( developer.android.com/reference/android/app/ActivityManager ). Lucu bahwa fungsi ini tidak ada: ActivityManager.isUserAMonkey().
ByteSlinger
1
Ini mendeteksi jika Anda menggunakan agen pengujian monyet untuk menguji aktivitas Anda. Meskipun nama yang lucu, itu mungkin cukup berguna untuk menguji (dan membuat orang lain tertawa, obvs.) Developer.android.com/studio/test/monkeyrunner
Ken Corey