2014-12-03 6 views
9

Kullanıcı tarafından belirli bir zaman aralığında (örneğin: 5 dk) erişilen apps listesini arka plan işinden mi öğrenmek istiyorsunuz? Köklü olmayan bir android telefonunda bu mümkün mü? Mümkünse, android hakkında harika bir öğrenim olacağı için cevabı bilmemle çok ilgileniyorum.Bir arka plan işini kullanarak bir kullanıcı tarafından erişilen uygulama listesi nasıl bulunur?

+0

Erişilen uygulamaları o aralıkta kaydetmek yeterli olur mu? – Storo

+0

Sadece o aralıkta eklenmiş uygulama adlarına ihtiyacım var. – Kishor

+0

Cevabımı kontrol ettin mi? Uygulama olsa da bir hata var. Yaklaşımda değil ama birçok program açtıktan sonra yok oluyor. Yöntemi bir hizmetten çağırmak sorunu çözer. ve doğrudan bir web servisine gönderilecek. ya da cihaza bazı yerlerde kaydetme. Uygulamam test amaçlı olarak bunları liste görünümünde görüntüler. UI'den herhangi bir şekilde kaybolur. Bir servisimiz olsa bile. Onları saklamamız gerek. – hasan83

cevap

-1

Evet. Bu hizmetinizin her 5 saniyede bir çalıştırılması gerekir. Bu hizmette, hangi uygulamaların kullanıcı tarafından erişilebildiğine ilişkin mantığı yazmanız gerekir. Çalışan uygulamaları çalıştırmak için ActivityManager sınıfını kullanmanız gerekir.

7

güncelle: robot 5.0 yöntem getAppTasks olan() getRecentTasks alternatif olarak

.

Kod örnek:

private void listTasks() throws PackageManager.NameNotFoundException { 
    ActivityManager mgr = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.AppTask> tasks = mgr.getAppTasks(); 
    String packagename; 
    String label; 
    for (ActivityManager.AppTask task: tasks){ 
    packagename = task.getTaskInfo().baseIntent.getComponent().getPackageName(); 
    label = getPackageManager().getApplicationLabel(getPackageManager().getApplicationInfo(packagename, PackageManager.GET_META_DATA)).toString(); 
    Log.v(TAG,packagename + ":" + label); 
    } 
} 

Orjinal Cevap:

Giriş

ActivityManager sınıfı böyle bir bilgiyi verir iki yöntem sağlar. GetRecentTasks veya getRunningTasks yöntemini seçmek, döndürülen görevler listesi zaten bizim amacımız olmadığı için uygun olacaktır. Ancak, istenen listeyi belirleme yolunda bir referans noktası olarak kullanılacaktır.

Kod örnek:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
List<RecentTaskInfo> activitys = activityManager.getRecentTasks(Integer.MAX_VALUE, ActivityManager.RECENT_IGNORE_UNAVAILABLE); 
for (int i = 0; i < activitys.size(); i++) { 
    RecentTaskInfo activity = activitys.get(i); 
    activity.baseIntent.getComponent().getPackageName(); 
} 

Filtreleme: Bu liste sistem görevleri de dahil olmak üzere görevlerin tümünü türünü içerir.

Kod örnek:

if (activity.baseIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) { 
    // This is an application. 
    getPackageManager() 
     .getApplicationLabel(getPackageManager() 
     .getApplicationInfo(activity.baseIntent.getComponent() 
     .getPackageName(), PackageManager.GET_META_DATA)); // application name 
} 

Bu uzun ev düğmesine basarak görünecektir aynı listedir.

Özet Yaklaşım: (Açıklama sonra gelir)

belirtilen süre içinde istenilen listeyi belirlemek için biz olacak çağrı (nokta). Son görev listesi, dönemin başlangıcında 'un başında ve aralıklar arayacağımız dönemindeki her küçük periyottan sonra istenecektir.

Son uygulamalar. İlk aradan sonra getirilen liste, üç tür uygulama içerecektir. İlgilendiğimiz eski uygulamalar, Yeni başlatılan ve Yeniden başlatılan uygulamalar. özet yaklaşımının seçilmesinin ardındaki neden, Yeniden başlatılan uygulamaları tespit etmektir.

algılama Yeni başlatılan uygulamalar:

olanlar uygulamalardır. Bu sadece ilk getirilen listesinde görünmedi. (dönemden önce).

  • Herhangi uygulamayı düşünmek için harika bir fikir olacaktır: bu yaklaşım neden örneklerle

açıklanması. uygulamanızdan önce görüntülendi. Daha sonra getirilen bir listede yeniden başlatılan bir uygulama. Uygulamayı başlattığımızdan beri, uygulama içinden, uygulamanızdan. listenin başındaydı.enter image description here

Ama uygulama. tepeden aşağı inebilir ve aralık süresi içinde ona geri döner. (Facebook> Twitter> Uygulamanız).

sonraki bir zorlama listesinde enter image description here

  • başka uygulamaların
  • . üstüne çıkabilir. referans olarak almak, uygulamanızla aynı nedenden dolayı başarısız olacaktır. referans olarak başarısız oldu.

Kazanma yaklaşım: bir aralık önce getirilen

listesi aralığından sonra getirilen liste için referans olacaktır. Yeniden başlatılan uygulamalar. uygulamalar olurdu. ilk sipariş-alt listeye (fosl) önüne çıktı.

enter image description here

Tüm uygulamalar. fosl önce yeniden başlatıldı sadece nedir app. Ve kolayca kanıtlanabilir. fosl değişti olmadan bazıları yeniden başlatıldı olabilir bir şekilde fosl üstünde uygulamaları sıralamak yolu yoktur (fazla uygulama eklemek büyüyecek). egzersiz yapabilirsin.

fosl yaklaşımı kullanıcı uygulamalardan bazılarını kaldırılmış olsa bile çok çalışacaktır. aralıktan manuel olarak listeden. Yalnızca kaldırılmış uygulamalar, önceki bir aralıkta tespit edilmediyse algılanmayacaktır. Ancak, listede kalanlar için fosl yaklaşımını etkilemeyecektir. Kullanıcı tüm listeyi temizlediyse aynı şeyi, sadece temizlenmiş uygulamaları. aynı aralıkta başlatılanlar tespit edilmeyecek ve değil.

Neden aralıkları?, çünkü böyle uzun bir süre için kullanıcı uygulamaları açabilir ve yeniden başlatabilir. sonra listeyi temizleyin veya bazılarını kaldırın.

Küçük aralıkları da fosl yaklaşımının tek zayıf olduğu yine aynı sırayla ile herhangi bir üst alt listesini açmak için kullanıcı bunu çok yapar.

Örnek Kod: (fosl)

public int getIndexOfFirstAppBeforeFOSL(ArrayList<App> recentApps) { 
    int i=previousRecentApps.size()-1, j = recentApps.size()-1; 
    for (; i>=0 && j>=0 ; i--) { 
     App app = previousRecentApps.get(i); 
     if (app.equals(recentApps.get(j))) { 
      j--; 
     } else { 
      // this application got re-launched and therefore it changed it place in list. 
      // or removed manually by user. 
     } 
    } 

    return j; 
} 

Ben uygulama için GitHub project yarattı. kontrol edin ve varsa hataları bildirin.

Sözünü ettiğimiz zayıflık için bir veya iki uygulamayı tespit etmekte başarısız olmanız, uygulama sonuçlarını toplamanızdan elde ettiğiniz araştırma sonucunu gerçekten etkilemek isteyecektir. Çok sayıda kullanıcı tarafından başlatılıyor. eğer sen zaten ne yapıyorsun? Aksi takdirde, uygulamanız. sık sık yeni başlatılan uygulama alabilirsiniz. ve kullanıcıyı bu konuda bilgilendirin.

+0

Şuna bak, bu gece geç saatlerde. Kod projesine son dakika değişiklikleri yaptım. her şeyi söyleyebilirim. Yaklaşım teorik olarak mükemmel gözüküyor. proje kodundaki hataları rapor et. Düzelteceğim. ilginç soru yine de. – hasan83

+2

NotRecentTasks() 'artık yapmanız gerekeni yapmazsa, tekniğiniz artık Android 5.0'dan itibaren çalışmayacaktır. – CommonsWare

+0

Evet, bu doğru. Ancak, cihazların% 80'i gibi bir süre daha çalışmaya devam edebilir. Eğer 5.0 veya üzerinde bir çözüm varsa cevabımı güncelleyeceğim. – hasan83