Определить, какое приложение было запущено в Android

Как определить, какое приложение было запущено пользователем в моем приложении, т. е. мое приложение должно получать уведомления, когда Whatsapp запускается пользователем, даже если мое приложение не работает на переднем плане или в фоновом режиме.

Мессенджер похода добился такой же функциональности со службой специальных возможностей.

Как я могу решить эту проблему ?

Заранее спасибо!!


person Pratap Vhatkar    schedule 03.02.2016    source источник
comment
ты нашел решение, брат??   -  person Md. Sulayman    schedule 18.03.2018


Ответы (3)


В зависимости от версии Android, на которой запущено ваше приложение, вам придется использовать разные методы. На устройствах Pre-Lollipop это довольно просто:

String[] result = new String[2];

List<ActivityManager.RunningTaskInfo> runningTasks;
ComponentName componentInfo;

runningTasks = activityManager.getRunningTasks(1);
componentInfo = runningTasks.get(0).topActivity;
result[0] = componentInfo.getPackageName();
result[1] = componentInfo.getClassName();

Если вы используете Lollipop или более новое устройство, вы должны использовать класс UsageStatsManager, который требует, чтобы вашему приложению были предоставлены определенные разрешения.

//no inspection ResourceType
UsageStatsManager mUsageStatsManager = (UsageStatsManager)context.getSystemService("usagestats");
long time = System.currentTimeMillis();

// We get usage stats for the last 10 seconds
List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);

// Sort the stats by the last time used
if(stats != null) {
    SortedMap<Long,UsageStats> mySortedMap = new TreeMap<>();
    for (UsageStats usageStats : stats) {
        mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
    }
    if(mySortedMap != null && !mySortedMap.isEmpty()) {
        return mySortedMap.get(mySortedMap.lastKey()).getPackageName();
    }
}

return null;

Это сообщит вам, предоставлены ли вашим приложениям разрешения:

try {
    PackageManager packageManager = context.getPackageManager();
    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
    AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
    return (mode != AppOpsManager.MODE_ALLOWED);
} catch (PackageManager.NameNotFoundException e) {
    return false;
}

И, наконец, это запустит действие по предоставлению разрешений Android для пользователя:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
activity.startActivity(intent);

надеюсь, это поможет

person malrok44    schedule 03.02.2016

Попробуйте этот код:

  ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
    List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
    for(int i = 0; i < procInfos.size(); i++)
    {
        if(procInfos.get(i).processName.equals("put the package name here")) 
        {
            Toast.makeText(getApplicationContext(), "Notify Message", Toast.LENGTH_LONG).show();
        }
    }
person viratpuar    schedule 03.02.2016
comment
Я могу только прочитать свое приложение. - person Naxsami; 01.12.2020

Нет, это невозможно с помощью общедоступного SDK.

Вы можете получить текущий запущенный процесс с помощью ActivityManager#getRunningAppProcesses Но получить уведомление определенно невозможно. Тем не менее, это не самый точный или эффективный метод.

person Rjz Satvara    schedule 03.02.2016