我需要将应用程序从后台转移到前台。我通过使用以下代码使这项工作适用于31以下的版本:
public static void bringApplicationToFront(Context context)
{
Log.d("bringApplicationToFront");
Intent notificationIntent = new Intent(context, SplashActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getActivity
(context, 0, notificationIntent, PendingIntent.FLAG_MUTABLE);
}
else {
pendingIntent = PendingIntent.getActivity
(context, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
}
try
{
pendingIntent.send();
}
catch (PendingIntent.CanceledException e)
{
e.printStackTrace();
}
}
SplashActivity是我的根Activity。我在BroadcastReceiver上尝试了这一点,还使用了延迟运行代码的后台线程。
我从应用程序类调用这个方法,如下所示:
@Override
public void onTrimMemory(int level)
{
super.onTrimMemory(level);
if (level == TRIM_MEMORY_UI_HIDDEN) {
Print.e("App is background");
bringApplicationToFront();
}
}
我如何使这项工作为API 31?
Android已经收紧了从后台进程(Service
、BroadcastReceiver
等(启动Activity
的限制。您可以在此处阅读相关信息:https://developer.android.com/guide/components/activities/background-starts#exceptions
可能您唯一能做的就是请求SYSTEM_ALERT_WINDOW
权限作为一种变通方法。就我个人而言,我认为这是一个可怕的黑客攻击,安卓可能会在未来的版本中堵住这个漏洞。