如何在前台应用程序切换时收到通知

时间:2016-06-09 09:41:24

标签: android events android-activity foreground background-service

我希望在前台应用程序更改时收到通知。有没有办法做到这一点?它也适用于在Android 5+上运行的设备。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

直到Android 5才有可能。 Lollipop弃用了getRunningTasks(),然后使用了getRunningAppProcess()。 MarshMallow不允许两者兼而有之。但是,使用Jared Rummler的外部小型库,您可以在Android上获得当前正在运行的进程。 链接是:https://github.com/jaredrummler/AndroidProcesses

如果你想要的话,我还可以发布我的代码直到Lollipop!

public class MyService extends Service {
Context context;
Handler handler;
Runnable runnable;
NotificationManager mNotificationManager;
NotificationCompat.Builder mBuilder;
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
}


@Override
public void onCreate() {
    super.onCreate();
    context = this;
    mBuilder =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.tick)
                    .setContentTitle("My notification")
                    .setContentText("Foreground Application Changed");

    Intent resultIntent = new Intent(context, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                    0,PendingIntent.FLAG_UPDATE_CURRENT
            );
    mBuilder.setContentIntent(resultPendingIntent);
    mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Log.i("debug", "in onCreateService");

    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            new Thread(new Runnable() {
                @Override
                public void run() {


                    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                    final Set<String> activePackages = new HashSet();
                    List<ActivityManager.RunningAppProcessInfo> list = activityManager.getRunningAppProcesses();

                    for (ActivityManager.RunningAppProcessInfo processInfo : list) {
                        if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                            activePackages.addAll(Arrays.asList(processInfo.pkgList));
                        }
                    }
                    for(String a : activePackages.toArray(new String[activePackages.size()])) {

                        if(foregroundApps.contains(a)) {
                            Log.i("debug", "App in foreground " + a);
                            mNotificationManager.notify(1, mBuilder.build());
                        }

                    }
                  }


            }).start();
            //process runnable object in 3 secs
            handler.postDelayed(this,3000);
        }
    };

    //make operation on UI thread, call runnable in 3 secs
    handler.postDelayed(runnable,3000);
}

从您的活动中启动此服务。要阻止获得所有正在运行的应用程序的通知,您可以列出所有已安装的应用程序。然后将其作为前台应用程序列表

传递
PackageManager packageManager;
List<PackageInfo> packages;
List<PackageInfo> packageList;
packageList = new ArrayList<>();   
packageManager = getPackageManager();
packages = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
    for (PackageInfo pi : packages) {
        boolean b = isSystemPackage(pi);
        if ((!b)) {
            packageList.add(pi);

        }
    }
}
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
            : false;

}
相关问题