我希望在前台应用程序更改时收到通知。有没有办法做到这一点?它也适用于在Android 5+上运行的设备。
任何人都可以帮助我吗?
答案 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;
}