Android: Geçerli ön plan etkinliğini (bir hizmetten) nasıl alabilirim?


180

Bir hizmetten şu anda çalışan Etkinliğe referans almanın yerel bir android yolu var mı?

Arka planda çalışan bir hizmetim var ve bir etkinlik gerçekleştiğinde (hizmette) geçerli Etkinliğimi güncellemek istiyorum. Bunu yapmanın kolay bir yolu var mı (yukarıda önerdiğim gibi)?


belki bu size bir fikir verebilir stackoverflow.com/a/28423385/185022
AZ_

Yanıtlar:


87

Bir hizmetten şu anda çalışan Etkinliğe referans almanın yerel bir android yolu var mı?

"Şu anda çalışan Etkinliğe" sahip olamazsınız.

Arka planda çalışan bir hizmetim var ve bir etkinlik gerçekleştiğinde (hizmette) geçerli Etkinliğimi güncellemek istiyorum. Bunu yapmanın kolay bir yolu var mı (yukarıda önerdiğim gibi)?

  1. IntentEtkinliğe bir yayın gönderin - işte bu modeli gösteren örnek bir proje
  2. Etkinliğin , hizmetin çağırdığı PendingIntent(örneğin, yoluyla createPendingResult())
  3. Etkinliğin hizmet aracılığıyla bir geri arama veya dinleyici nesnesi kaydettirmesini bindService()ve hizmetin söz konusu geri arama / dinleyici nesnesinde bir olay yöntemini çağırmasını sağlayın
  4. IntentEtkinliğe düşük öncelikli BroadcastReceiverolarak yedeklenmiş bir yayın gönderin (etkinlik Notificationekranda değilse bir yükseltmek için ) - işte bu kalıp hakkında daha fazla bilgi içeren bir blog yazısı

3
Teşekkürler, ama bir sürü aktivitem var ve hepsini güncellemek istemediğim için, ön planAktivite almak için bir android yolu arıyordum. Söylediğin gibi, bunu yapamam. Bunun için yolumu bulmam gerekiyor.
George

1
@George: Ne istersen sana yardım etmeyecek zaten. İşaret ettiğiniz gibi, "bir sürü aktiviteniz" var. Dolayısıyla, bunların hepsi ayrı sınıflardır. Bu nedenle, hizmetinizin büyük bir if-bloğu bloğu olmadan instanceofveya ortak bir üst sınıf veya arayüzü paylaşmak için etkinlikleri yeniden düzenlemeden onlarla yapabileceği hiçbir şey yoktur . Ve faaliyetleri yeniden düzenleyecekseniz, bunu çerçeveye daha iyi uyacak ve hiçbir etkinliğiniz gibi daha fazla senaryoyu kapsayacak şekilde yapabilirsiniz. # 4 muhtemelen en az iş ve en esnektir.
CommonsWare

2
Teşekkürler, ama daha iyi bir çözümüm var. Tüm etkinliklerim özelleştirilmiş bir BaseActivity sınıfını genişletiyor. Benim BaseActivity sınıfında litrely 3 satır ile her zaman ön planda olduğunda geçerli olarak etkinliği kaydeder bir ContextRegister belirledim. Yine de destek için teşekkürler.
George

3
@George: Bellek sızıntılarına dikkat edin. Değişken statik veri üyelerinden mümkün olduğunca Java'da kaçınılmalıdır.
CommonsWare

Nesneyi sıkıca kapsülledim, ancak bunu aklımda tutacağım. Teşekkürler.
George

139

Güncelleme : Bu , Android 5.0'dan itibaren diğer uygulamaların etkinlikleri ile artık çalışmıyor


Etkinlik yöneticisini kullanarak bunu yapmanın iyi bir yolu var. Temel olarak runningTasks'ı etkinlik yöneticisinden alırsınız. Her zaman önce o anda etkin olan görevi döndürür. Oradan topActivity'yi alabilirsiniz.

Burada örnek

ActivityManager hizmetinden çalışan görevlerin bir listesini almanın kolay bir yolu vardır. Telefonda çalışan maksimum sayıda görev isteyebilirsiniz ve varsayılan olarak ilk olarak o anda etkin olan görev döndürülür.

Bunu yaptıktan sonra listenizden topActivity isteğinde bulunarak bir ComponentName nesnesi alabilirsiniz.

İşte bir örnek.

    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();

Manifestinizde aşağıdaki izne ihtiyacınız olacak:

<uses-permission android:name="android.permission.GET_TASKS"/>

3
Cevabınız% 100 doğru.Teşekkürler 4 it.Aynı cevabı burada yayınlamanız daha iyi
Shahzad Imam

1
@ArtOfWarfare doğrulanmadı, ancak evet, sahip olduğunuz parçaların sayısı her zaman tek bir etkinlik tarafından barındırıldığı için alakasız.
Nelson Ramirez

2
Mevcut etkinliğe daha sık ihtiyacım varsa, çok sık anket yapmak zorundayım değil mi? Ön plan etkinliği her değiştiğinde geri arama olayı almanın bir yolu var mı?
nizam.sp

43
Herkesin farkında olması için dokümanlar bunu getRunningTasks () yöntemi hakkında belirtir. -------- Not: Bu yöntem yalnızca görev yönetimi kullanıcı arayüzlerinde hata ayıklama ve sunma amaçlıdır. Bu, burada bulunan bilgilere dayanarak farklı davranışlar arasında karar vermek gibi bir uygulamadaki temel mantık için asla kullanılmamalıdır. Bu tür kullanımlar desteklenmez ve gelecekte kırılacaktır. Örneğin, aynı anda birden fazla uygulama aktif olarak çalışıyorsa, kontrol akışı amacıyla buradaki verilerin anlamı hakkında yapılan varsayımlar yanlış olacaktır. ------------
Ryan

30
api 21'de As 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.
semifake

116

Uyarı: Google Play ihlali

Google, erişilebilirlik hizmetlerini erişilemezlik amacıyla kullanıyorsa uygulamaları Play Store'dan kaldırmakla tehdit etti. Bununla birlikte, bunun yeniden değerlendirildiği bildirilmektedir .


Kullanın AccessibilityService

Yararları

  • Android 7.1 (API 25) aracılığıyla Android 2.2'de (API 8) test edildi ve çalışıyor.
  • Yoklama gerektirmez.
  • GET_TASKSİzin gerektirmez .

Dezavantajları

  • Her kullanıcının hizmeti Android'in erişilebilirlik ayarlarında etkinleştirmesi gerekir.
  • Bu% 100 güvenilir değil. Bazen olaylar sıra dışı olur.
  • Hizmet her zaman çalışıyor.
  • Bir kullanıcı etkinleştirmeye çalıştığında AccessibilityService, bir uygulama ekrana bir yer paylaşımı yerleştirmişse Tamam düğmesine basamaz. Bunu yapan bazı uygulamalar Velis Auto Brightness ve Lux'tur. Bu kafa karıştırıcı olabilir, çünkü kullanıcı düğmeye neden basamayacağını veya etrafta nasıl çalışacağını bilemeyebilir.
  • AccessibilityServiceİlk kadar geçerli aktiviteyi anlayamayacaksınız değişim faaliyetinin.

Misal

Hizmet

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

Bunu manifestinizde birleştirin:

<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>

Servis Bilgisi

Şunu koyun 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"/>

Hizmeti Etkinleştirme

Uygulamanın her kullanıcısının kullanılabilmesi için açık bir şekilde etkinleştirmesi gerekir AccessibilityService. Bunun nasıl yapılacağı için bu StackOverflow yanıtına bakın .

Bir uygulama ekrana Velis Auto Brightness veya Lux gibi bir yer paylaşımı yerleştirmişse, erişilebilirlik hizmetini etkinleştirmeye çalışırken kullanıcının OK düğmesine basamayacağını unutmayın.


1
@lovemint, ne demek: Ben bir örnek belirtilen settingsActivityarasında your.app.ServiceSettingsActivitysize erişilebilirlik hizmeti için kendi ayarları etkinliğe bu değişmelidir, böylece. Ayarları etkinliğinin zaten isteğe bağlı olduğunu düşünüyorum, bu yüzden daha basit hale getirmek için bu kısmı cevabımdan kaldırdım.
Sam

1
Çok teşekkürler, sadece son soru. API 8 akım için uğraşmak gerekirse ben kod yerine XML kullanarak bu iş yapmalıyım?
paolo2988

1
@lovemint, doğru. Bunu yapmak için örnek kodu güncelledim.
Sam

1
@ Bu hizmetin mükemmel çalıştığını doğrulayabilirim. Garip bir davranış, ana faaliyette Erişilebilirlik Hizmeti'ni etkinleştirmek için bir amaç kullandım. Bu ilk etkinleştirmeden sonra hizmet etkinleştirilir ancak onAccessibilityEventherhangi bir olay almaz, ancak Erişilebilirlik Hizmeti'ni devre dışı bırakır ve yeniden etkinleştirirsem hizmet yeniden etkinleştirilir ve onAccessibilityEventçalışmaya başlar.
paolo2988

2
Kodun için teşekkürler. Senin için bu uygulamayı yarattım :)
tonoz

20

Tarafından yapılabilir:

  1. Kendi uygulama sınıfınızı uygulayın, ActivityLifecycleCallbacks'e kaydolun - bu şekilde uygulamamızda neler olup bittiğini görebilirsiniz. Her özgeçmişte geri arama, ekranda geçerli görünür etkinliği atar ve duraklattığında atamayı kaldırır. registerActivityLifecycleCallbacks()API 14'te eklenen yöntemi kullanır .

    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. Servis çağırın getApplication()ve uygulama sınıfı adınıza yayınlayın (bu durumda uygulama). Arayabileceğinizden app.getActiveActivity()- bu size geçerli bir görünür Etkinlik verir (veya hiçbir etkinlik görünmediğinde boş olur). Etkinliğin adını arayarak alabilirsinizactiveActivity.getClass().getSimpleName()


1
ActiveActivity.getClass (). GetSimpleName () 'de Nullpointer yürütmesi alıyorum. Lütfen yardım edebilir misiniz
acemi

ActivityLifecycleCallbacks öğesinden görebileceğiniz gibi - etkinliğin görünmemesi durumunda application.getActiveActivity () null değerini döndürür. Bu, hiçbir etkinliğin görünmediği anlamına gelir. Bunu hizmetinizde veya başka herhangi bir yerde kontrol etmeniz gerekir.
Vit Veres

Tamam ... ama faaliyetin devam etmesi durumunda bu null döndürmemelidir ?? Etkinliğim başlamıştı ve özgeçmişinde bunu başardım
acemi

Sabit kesme noktaları koymak için deneyin tahmin etmek onActivityResumed(), onActivityPaused()ve getActiveActivity()bu kadar, eğer callet nasıl görmek için.
Vit Veres

@beginner biri olmadığını kontrol etmeli activityve activeActivityatamadan önce aynıdır activeActivityile nullbağlı çeşitli etkinliklerin yaşam döngüsü yöntemlerinin iç içe çağıran düzene önlemek hataları için.
Rahul Tiwari

16

Ekibimizin mutlu olacağı bir çözüm bulamadık, bu yüzden kendi ekibimizi yuvarladık. Biz kullanmak ActivityLifecycleCallbacksmevcut etkinlik izlemek ve daha sonra bir hizmet aracılığıyla hale getirileceğini:

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
            }
        });
    }
}

Ardından DI kapsayıcısını, MyApplication forContextProvider , örn.

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

(Uygulamasının getCurrent()yukarıdaki koddan çıkarıldığını unutmayın . Bu yalnızca uygulama yapıcısından ayarlanan statik bir değişkendir)


4
biri olmadığını kontrol etmeli activityve currentActivityatamadan önce aynıdır currentActivityile nullbağlı çeşitli etkinliklerin yaşam döngüsü yöntemlerinin iç içe çağıran düzene önlemek hataları için.
Rahul Tiwari

14

kullanım ActivityManager

Yalnızca geçerli etkinliği içeren uygulamayı bilmek istiyorsanız bunu kullanarak yapabilirsiniz ActivityManager. Kullanabileceğiniz teknik Android sürümüne bağlıdır:

Yararları

  • Bugüne kadar tüm Android sürümlerinde çalışmalıdır.

Dezavantajları

  • Android 5.1 ve sonraki sürümlerinde çalışmaz (yalnızca kendi uygulamanızı döndürür)
  • Bu API'ların belgeleri , yalnızca hata ayıklama ve kullanıcı arayüzlerini yönetme amaçlı olduklarını söylüyor.
  • Gerçek zamanlı güncellemeler istiyorsanız, yoklama kullanmanız gerekir.
  • Gizli bir API'ya dayanır: ActivityManager.RunningAppProcessInfo.processState
  • Bu uygulama, uygulama değiştirici etkinliğini almıyor.

Örnek ( KNaito koduna göre )

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);
    }

}

Belirgin

GET_TASKSİzni ekle AndroidManifest.xml:

<!--suppress DeprecatedClassUsageInspection -->
<uses-permission android:name="android.permission.GET_TASKS" />

10
bu artık Android M'de çalışmaz. getRunningAppProcesses () artık yalnızca uygulamanızın paketini döndürüyor
Lior Iluz

1
API Seviye 22 (Android 5.1) için de çalışmaz. Yapı LPB23 üzerinde test edildi
sumitb.mdi

9

Bunu testlerim için kullanıyorum. API> 19 ve yalnızca uygulamanızın etkinlikleri için.

@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");
}

ArrayMap'i Harita ile değiştirin, 4.3 üzerinde de çalışır. Önceki Android sürümleri test edilmedi.
Oliver Jonas

2

API 21 veya üstü için bu kodu kullanın. Bu işe yarar ve diğer cevaplara göre daha iyi sonuç verir, ön plan sürecini mükemmel bir şekilde algılar.

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();
        }
    }

Lütfen bu yöntemden elde edilen sonuçların diğer cevaplardan daha iyi olduğunu açıklayabilir misiniz?
Sam

Bu Bildirim Menüsü ile de çalışır. Bir arama veya mesaj alırsam hangi bir sorunla karşı karşıyayım. UsageStatsManager bana uygulamam yerine systemUi paketinin adını vermeye başlar.
19'da kukroid

@kukroid, ayrı bir soru gönderin ve kaynak kodunuzu, cihaz bilgilerinizi ve kullandığınız mesajlaşma ve telefon uygulamalarını ekleyin.
Sam

0

İşte benim iyi çalışan cevabım ...

Mevcut Etkinliği bu şekilde elde edebilmeniz gerekir ... Uygulamanızı birçok parçalı birkaç Etkinlikle yapılandırırsanız ve mevcut Etkinliğinizin ne olduğunu takip etmek istiyorsanız, çok fazla iş gerekir. Senaryom, birden fazla Fragmanlı bir Faaliyetim olmasıydı. Böylece, Geçerli değişkenlerin tüm mevcut durumunu depolayabilen Uygulama Nesnesi aracılığıyla Güncel Etkinliği takip edebilirim.

İşte bir yol. Etkinliğinizi başlattığınızda, söz konusu Etkinliği Application.setCurrentActivity (getIntent ()); Bu uygulama saklayacaktır. Hizmet sınıfınızda, Intent currentIntent = Application.getCurrentActivity (); . GetApplication () startActivity (currentIntent);


2
Bu, hizmetin Faaliyet ile aynı süreçte çalıştığını varsayar, değil mi?
cehennem gözü

0

Bu aptalca bir cevap olup olmadığını bilmiyorum, ancak herhangi bir etkinliğin onCreate () 'e her girdiğimde paylaşılan tercihlerde bir bayrak saklayarak bu sorunu çözdüm, daha sonra ön plan etkinliğinin ne olduğunu bulmak için shered tercihlerin değerini kullandım.


1
Bunu yapmak için yerel bir yol arıyoruz
IgniteCoders

-3

Son zamanlarda bunu öğrendim. Apis ile:

  • minSdkSürümü 19
  • targetSdkVersion 26

    ActivityManager.getCurrentActivity (bağlama)

Umarım bu herhangi bir kullanımdır.


1
Umutlarım yükseldi. Belki de bu cevap verildiğinde vardı, ancak şu an sınıfta bir getCurrentActivity()işlev yok ActivityManager( developer.android.com/reference/android/app/ActivityManager ). Komik biri bu fonksiyon olmadığını: ActivityManager.isUserAMonkey().
ByteSlinger

1
Bu, etkinliğinizi test etmek için bir maymun test ajanı kullanıp kullanmadığınızı algılar. Komik bir isim olmasına rağmen, test etmek için oldukça yararlı olabilir (ve diğer insanları güldürmek, obvs.) Developer.android.com/studio/test/monkeyrunner
Ken Corey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.