随着Android版本的更新, 又是基于安全!安全! 非系统层APP想要正大光明的或搞点小手段在后台长时间或者"永久"保活是愈发不可实现了(当然排除一些"黑技术"),大陆定制化的OS又为了更好的保证UI的流畅性也更是把此拿捏的死死的(除了QQ,微信,支付宝等这类占据市场主导地位的APP手机厂商加入了白名单).这对于一个闻不见经传的中小企业为了能让自家的智能外设能与APP之间的连接建立的长久一些, 数据通信能尽可能不出现中断, 引导用户自行设置APP后台运行和避免APP被清除已成单选项.

直接上代码

1. 首先创建一个service

package com.example.testone.service;import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.IBinder;
import androidx.core.app.NotificationCompat;import com.example.testone.R;import static androidx.core.app.NotificationCompat.PRIORITY_HIGH;
import static androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC;public class TestService extends Service {private final String CHANNEL_ONE_ID = "100";@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onCreate() {super.onCreate();/****************第一点*******************///创建通知栏常驻通知initNotif("title", "text");}@Overridepublic void onDestroy() {stopForeground(true);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {
//        return super.onStartCommand(intent, flags, startId);/****************第二点*******************///返回START_STICKY,被系统或手动清理后可重启return START_STICKY;}public void initNotif(String title, String context) {NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//RemoteViews remoteView = new RemoteViews(getPackageName(), R.layout.RemoteView); Intent nfIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nfIntent, PendingIntent.FLAG_IMMUTABLE);@SuppressLint("WrongConstant") NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ONE_ID).setContentIntent(pendingIntent) // 设置PendingIntent.setSmallIcon(R.mipmap.ic_launcher) // 设置状态栏内的小图标//.setLargeIcon(bitmapIcon)// 设置大图标.setContentTitle(title).setContentText(context) // 设置内容//.setWhen(System.currentTimeMillis())// 设置该通知发生的时间.setVisibility(VISIBILITY_PUBLIC)// 锁屏显示全部通知//.setDefaults(Notification.DEFAULT_ALL)// //使用默认的声音、振动、闪光.setCategory(Notification.CATEGORY_SERVICE)//设置类别.setPriority(PRIORITY_MAX);// 优先级为:重要通知if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//安卓8.0以上系统要求通知设置Channel,否则会报错NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ONE_ID, "服务常驻通知", NotificationManager.IMPORTANCE_HIGH);notificationChannel.setLockscreenVisibility(VISIBILITY_PUBLIC);//锁屏显示全部通知manager.createNotificationChannel(notificationChannel);builder.setChannelId(CHANNEL_ONE_ID);}Notification notification = builder.build(); // 获取构建好的Notification//notification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音notification.flags = Notification.FLAG_NO_CLEAR;//不消失的常驻通知startForeground(1, notification);//设置常驻通知}}

2. 再创建个Service继承NotificationListenerService先在AndroidManifest.xml中声明,方可在MainActivity中调用方法isNotificationListenerEnabled跳转到系统设置-->获取通知使用权的应用列表里出现当前APP。

package com.example.testone.service;import android.app.Notification;
import android.content.Intent;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;public class TestNotificationListenerService extends NotificationListenerService {@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onNotificationPosted(StatusBarNotification sbn) {super.onNotificationPosted(sbn);//Notification notification = sbn.getNotification();Log.d(LiveTaskApplication.TAG, "sbn.getPackageName: " + sbn.getPackageName());}
}

3. 创建Application

package com.example.testone.service;import android.app.Application;
import android.content.Intent;
import android.os.Build;public class TestApplication extends Application {@Overridepublic void onCreate() {super.onCreate();startService();}/*** 启动服务*/private void startService() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {/****************第三点*******************///安卓8.0以上开启为前台服务startForegroundService(new Intent(this, TestService.class));} else {startService(new Intent(this, TestService.class));}startService(new Intent(this, TestNotificationListenerService.class));}}

4. AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.testone"><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /><!-- 厂商自启动权限 --><uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE" /><uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT" /><applicationandroid:name=".service.TestApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".activity.MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name=".service.TestNotificationListenerService"android:enabled="true"android:exported="true"android:label="@string/app_name"android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"><!--必要的绑定权限--><intent-filter><action android:name="android.service.notification.NotificationListenerService" /><!--必要的action--></intent-filter></service><serviceandroid:name=".service.TestService"android:directBootAware="true"android:enabled="true"android:exported="true"android:label="@string/app_name"android:foregroundServiceType="phoneCall|mediaPlayback|dataSync|mediaProjection|connectedDevice|location" /></application></manifest>

5. activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/titleBar"android:layout_width="match_parent"android:layout_height="50dp"android:clipToPadding="true"tools:context=".activity.BaseActivity"><!--android:fitsSystemWindows="true"--><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:orientation="horizontal"android:padding="10dp"><TextViewandroid:id="@+id/left"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:gravity="center"android:text="返回"android:textColor="@android:color/black"android:visibility="visible" /><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:gravity="center"android:text="后台运行设置"android:textColor="@android:color/black"android:textSize="20sp"android:textStyle="bold" /><TextViewandroid:id="@+id/right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_centerVertical="true"android:gravity="center"android:text=""android:textColor="@android:color/black"android:visibility="gone" /></RelativeLayout><Viewandroid:id="@+id/line"android:layout_width="match_parent"android:layout_height="1dp"android:layout_alignParentBottom="true"android:background="?android:attr/listDivider"android:visibility="visible" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"android:padding="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="你的手机"android:textColor="@android:color/black"android:textSize="18sp" /><TextViewandroid:id="@+id/bandName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:gravity="center_vertical"android:text="HUAWEI"android:textColor="@android:color/holo_orange_dark"android:textSize="18sp" /></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="20dp"android:text="为什么要让应用程序在后台运行?"android:textColor="@android:color/black"android:textSize="14sp"android:textStyle="bold" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:paddingStart="40dp"android:paddingTop="20dp"android:paddingEnd="40dp"android:paddingBottom="20dp"android:text="接收通知需要应用在后台持续运行,以避免进程被系统终止。 这可能会错过来电和信息。"android:textColor="@android:color/black"android:textSize="14sp" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:paddingStart="40dp"android:paddingEnd="40dp"android:text="注意:如果您的手机上安装了第三方安全管理应用,请将IMFitPro添加到它们的例外中, 不受其约束。"android:textColor="@android:color/black"android:textSize="14sp" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"><TextViewandroid:id="@+id/tutorials"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:drawablePadding="20dp"android:gravity="center"android:text="查看自启动教程"android:textColor="@android:color/holo_orange_dark"android:textSize="18sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:id="@+id/autoStart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:drawablePadding="20dp"android:gravity="center"android:text="设置自启动"android:textColor="@android:color/holo_orange_dark"android:textSize="18sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:id="@+id/lockApp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:drawablePadding="20dp"android:gravity="center"android:text="在后台锁定应用程序"android:textColor="@android:color/holo_orange_dark"android:textSize="18sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:id="@+id/battery_optimization"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@drawable/btn_white_ripple"android:drawableEnd="@drawable/girl_enter"android:drawablePadding="20dp"android:gravity="center"android:text="忽略电池优化"android:textColor="@android:color/holo_orange_dark"android:textSize="18sp" /></RelativeLayout></LinearLayout></ScrollView><WebViewandroid:id="@+id/webView1"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"android:visibility="gone" /><WebViewandroid:id="@+id/webView2"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white"android:visibility="gone" /></RelativeLayout>
</LinearLayout>

6. MainActivity

package com.example.testone.service;import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;import com.example.testone.R;import java.util.Locale;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private TextView mLeft;private TextView mBandName;private TextView mAutoStart;private TextView mTutorials;private TextView mLockApp;private TextView mBatteryOptimization;private WebView mWebView1, mWebView2;private boolean isWeb = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);//提示: 需要与服务共享数据自行绑定服务initView();/****************第四点*******************///开启通知使用权限(有的手机需要开启才能在APP被kill掉后重启APP进程)if(!isNotificationListenerEnabled(this)) {openNotificationListenSettings(this);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 200) {if (isNotificationListenerEnabled(this)) {//已经开启通知使用权//未开启APP通知,去开启if (!isNotificationEnabledForApp(this))openNotificationSettingsForApp(this);}} else if (requestCode == 100) {if (isNotificationEnabledForApp(this)) {//已经开启APP通知//绑定了TestService再调用一下TestService中的initNotif()方法弹出通知。}}}/*** 是否开启APP通知** @param context* @return*/public static boolean isNotificationEnabledForApp(Context context) {return NotificationManagerCompat.from(context).areNotificationsEnabled();}/*** 开启APP通知** @param context*/public static void openNotificationSettingsForApp(Activity context) {try {// 锤子不能单个打开自己APP的 通知设置 界面 (打开界面方式有时间可以研究一下)if (getDeviceBrand().equalsIgnoreCase("SMARTISAN")) {Toast.makeText(context, "锤子手机请手动打开 设置--通知中心--开启IMFitPro通知开关", Toast.LENGTH_LONG).show();return;}// Links to this app's notification settings.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0Intent intent = new Intent();intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());intent.putExtra("app_package", context.getPackageName());intent.putExtra("app_uid", context.getApplicationInfo().uid);context.startActivityForResult(intent, 100);}} catch (Exception e) {e.printStackTrace();}}/*** 是否开启通知使用权限** @param context* @return*/public static boolean isNotificationListenerEnabled(Context context) {Set<String> packageNames = NotificationManagerCompat.getEnabledListenerPackages(context);if (packageNames.contains(context.getPackageName())) {return true;}return false;}/*** 开启通知使用权限*/public static void openNotificationListenSettings(Activity context) {try {Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);context.startActivityForResult(intent, 200);} catch (Exception e) {e.printStackTrace();}}private void initView() {mBandName = (TextView) findViewById(R.id.bandName);mLeft = (TextView) findViewById(R.id.left);mLeft.setOnClickListener(this);mAutoStart = (TextView) findViewById(R.id.autoStart);mAutoStart.setOnClickListener(this);mTutorials = (TextView) findViewById(R.id.tutorials);mTutorials.setOnClickListener(this);mLockApp = (TextView) findViewById(R.id.lockApp);mLockApp.setOnClickListener(this);mBatteryOptimization = (TextView) findViewById(R.id.battery_optimization);mBatteryOptimization.setOnClickListener(this);mWebView1 = (WebView) findViewById(R.id.webView1);mWebView1.setOnClickListener(this);mWebView2 = (WebView) findViewById(R.id.webView2);mWebView2.setOnClickListener(this);mBandName.setText(getDeviceBrand());}@Overridepublic void onClick(View v) {if (v == mLeft) {if (isWeb) {isWeb = false;mWebView1.setVisibility(View.GONE);mWebView2.setVisibility(View.GONE);return;}finish();} else if (v == mTutorials) {isWeb = true;mWebView1.setVisibility(View.VISIBLE);String brand = getDeviceBrand();String htmlName = "";if (brand.equalsIgnoreCase("huawei")) {htmlName = "huawei";} else if (brand.equalsIgnoreCase("honor")) {htmlName = "honor";} else if (brand.equalsIgnoreCase("infinix")) {htmlName = "infinix";} else if (brand.equalsIgnoreCase("meizu")) {htmlName = "meizu";} else if (brand.equalsIgnoreCase("xiaomi")) {htmlName = "xiaomi";} else if (brand.equalsIgnoreCase("redmi")) {htmlName = "redmi";} else if (brand.equalsIgnoreCase("oppo")) {htmlName = "oppo";} else if (brand.equalsIgnoreCase("realme")) {htmlName = "realme";} else if (brand.equalsIgnoreCase("onePlus")) {htmlName = "onePlus";} else if (brand.equalsIgnoreCase("vivo")) {htmlName = "vivo";} else if (brand.equalsIgnoreCase("iqoo")) {htmlName = "iqoo";} else if (brand.equalsIgnoreCase("smartisan")) {htmlName = "smartisan";} else if (brand.equalsIgnoreCase("sumsang")) {htmlName = "sumsang";} else if (brand.equalsIgnoreCase("asus")) {htmlName = "asus";} else if (brand.equalsIgnoreCase("lenovo")) {htmlName = "lenovo";} else if (brand.equalsIgnoreCase("nubia")) {htmlName = "nubia";}if (!getSystemLanguage().contains("zh")) {// 非中文htmlName = htmlName + "_e";}mWebView1.loadUrl("http://服务器接口地址/autostart/autostart_" + htmlName + ".html");} else if (v == mAutoStart) {Intent intents = null;for (Intent intent : AutoStartAppUtil.POWERMANAGER_INTENTS)if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {intents = intent;break;}Log.e("gy", "手机品牌 device brand:" + getDeviceBrand());if (intents != null) {if (getDeviceBrand().equalsIgnoreCase("Infinix")) {Toast.makeText(this, "无权打开系统界面, 请点击查看教程手动设置", Toast.LENGTH_SHORT).show();return;}if (getDeviceBrand().equalsIgnoreCase("OPPO") || getDeviceBrand().equalsIgnoreCase("realme")) {if (ContextCompat.checkSelfPermission(MainActivity.this, "oppo.permission.OPPO_COMPONENT_SAFE") != PackageManager.PERMISSION_GRANTED) {// oppo 为系统权限不对外开放Toast.makeText(this, "无权打开系统界面, 请点击查看教程手动设置", Toast.LENGTH_SHORT).show();
//                        ActivityCompat.requestPermissions(PermissionsDescriptionActivity.this, new
//                                String[]{"oppo.permission.OPPO_COMPONENT_SAFE"}, 1);} else {startActivity(intents);}return;}startActivity(intents);} else {if (getDeviceBrand().equalsIgnoreCase("OnePlus")) {intents = new Intent("com.android.settings.action.BACKGROUND_OPTIMIZE");startActivity(intents);return;}
//                if (SystemUtil.getDeviceBrand().equalsIgnoreCase("SMARTISAN")) {
//                    intents = new Intent("com.smartisanos.security.action.SWITCHED_PERMISSIONS_NEW");//无效
//                    startActivity(intents);
//                    return;
//                }Toast.makeText(this, "无权打开系统界面, 请点击查看教程手动设置", Toast.LENGTH_SHORT).show();}} else if (v == mLockApp) {isWeb = true;mWebView2.setVisibility(View.VISIBLE);if (getSystemLanguage().contains("zh")) {// 中文mWebView2.loadUrl("http://服务器接口地址/locktask/lockApp.html");} else {mWebView2.loadUrl("http://服务器接口地址/locktask/lockApp_e.html");}} else if (v == mBatteryOptimization) {// 显示屏幕以控制哪些应用可以忽略电池优化// 您可以PowerManager.isIgnoringBatteryOptimizations()用来确定应用程序是否已经忽略优化。// 您可以 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS用来要求用户将您放在此列表中。//android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGSAlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.mipmap.ic_launcher).setTitle("忽略电池优化").setMessage("参考说明:\n在手机&#160;设置&#160;-->&#160;电池&#160;-->&#160;耗电管理&#160;中找到" + getString(R.string.app_name) + ",&#160;设置&#160;允许后台运行&#160;或&#160;允许后台启动 等").setPositiveButton("设置忽略", new DialogInterface.OnClickListener() {@Overridepublic void onClick(final DialogInterface dialog, final int which) {if (!isIgnoringBatteryOptimizations()) {try {Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);intent.setData(Uri.parse("package:" + getPackageName()));//跳转之前判断intent是否存在,否则有的机型会报找不到activityif (intent.resolveActivity(getPackageManager()) == null) {intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);intent.setData(Uri.parse("package:" + getPackageName()));if (intent.resolveActivity(getPackageManager()) == null) {showToast("无法启动系统界面,请以参考说明操作");} else {startActivity(intent);}} else {startActivity(intent);}} catch (Exception e) {e.printStackTrace();}}}}).show();}}/*** 确定应用程序是否已经忽略电池优化** @return*/private boolean isIgnoringBatteryOptimizations() {boolean isIgnoring = false;PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);if (powerManager != null) {isIgnoring = powerManager.isIgnoringBatteryOptimizations(getPackageName());}return isIgnoring;}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {Intent intents = null;for (Intent intent : AutoStartAppUtil.POWERMANAGER_INTENTS)if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {intents = intent;break;}if (intents != null) {startActivity(intents);}} else {Toast.makeText(this, "无权打开系统界面, 请点击查看教程手动设置", Toast.LENGTH_SHORT).show();}break;default:}}/*** 原生Android系统 开启后台运行调用这里*/public void requestIgnoreBatteryOptimizations() {try {Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);intent.setData(Uri.parse("package:" + getPackageName()));startActivity(intent);} catch (Exception e) {e.printStackTrace();}}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {moveTaskToBack(true);//按返回键,不 finish activityreturn true;}return super.onKeyDown(keyCode, event);}/*** 获取当前手机系统语言。** @return 返回当前系统语言。例如:当前设置的是“中文-中国”,则返回“zh-CN”*/public static String getSystemLanguage() {return Locale.getDefault().getLanguage();}/*** 获取当前系统上的语言列表(Locale列表)** @return  语言列表*/public static Locale[] getSystemLanguageList() {return Locale.getAvailableLocales();}/*** 获取当前手机系统版本号** @return  系统版本号*/public static String getSystemVersion() {return android.os.Build.VERSION.RELEASE;}/*** 获取手机型号** @return  手机型号*/public static String getSystemModel() {return android.os.Build.MODEL;}/*** 获取手机厂商** @return  手机厂商*/public static String getDeviceBrand() {return android.os.Build.BRAND;}}

mWebView1.loadUrl(), mWebView2.loadUrl() 的 HTML 文件资源地址:
链接: https://pan.baidu.com/s/1vmRHsQDOHMw7iY-7OlA65Q 提取码: n83x

7. AutoStartAppUtil

package com.example.testone.service;import android.content.ComponentName;
import android.content.Intent;/*** 自启动跳转界面清单*/
public class AutoStartAppUtil {public static final Intent[] POWERMANAGER_INTENTS = {new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),//new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.privacypermissionsentry.PermissionTopActivity")),new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),new Intent().setComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.battery.ui.BatteryActivity")),new Intent().setComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),new Intent().setComponent(new ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity")),new Intent().setComponent(new ComponentName("com.transsion.phonemanager", "com.itel.autobootmanager.activity.AutoBootMgrActivity")),new Intent().setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.permission.SmartBGActivity")),new Intent().setComponent(new ComponentName("cn.nubia.security2", "cn.nubia.security.appmanage.selfstart.ui.SelfStartActivity")),new Intent().setComponent(new ComponentName("com.transsion.phonemaster", "com.cyin.himgr.applicationmanager.view.activities.AutoStartActivity")),};}

效果:

APP后台运行设置

安卓引导用户设置APP运行后台保活相关推荐

  1. 小程序引导用户下载APP

    因为小程序里面是无法跳转第三方商店 虽然可以实现跳转应用宝下载页(利用<web-view>可以实现跳转到下载该APP的应用宝地址,当用户点击普通下载时是没有问题的,当用户安装了应用宝,点击 ...

  2. iOS App后台保活

    女主宣言 前段时间,笔者和GY哥一起吃饭聊天的时候,GY哥问了笔者一个问题,iOS App 可以后台保活吗?是如何做到后台保活的?当时笔者只想到了可以在后台播放静音的音乐,对于唤醒App,可以考虑使用 ...

  3. 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)

    全面盘点当前Android后台保活方案的真实运行效果(截止2019年前) 本文原作者"minminaya",作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作 ...

  4. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )

    文章目录 一.申请权限 二.申请权限原理对话框 三.引导用户手动设置权限对话框 四.在 AndroidManifest.xml 中配置权限 五.完整代码示例 六.GitHub 地址 一.申请权限 申请 ...

  5. 加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

  6. android 服务保活之白名单,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

  7. Android 保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)

    " 本文已同步发布于52im社区:http://www.52im.net/thread-3033-1-1.html 1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里 ...

  8. Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

  9. android 进程保活6.0_Android 保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

最新文章

  1. Postman使用Date数据类型,Postman发送Date类型数据,Postman模拟前端调用
  2. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
  3. 社交平台中的会员等级制度建立需要注意哪些问题
  4. POJ 3417 Network
  5. mac安装QT及QT基本使用
  6. linux中的网络体系结构
  7. Go程序:演示map用法
  8. python不同版本安装;第三方库的安装
  9. TensorFlow神经网络(二)反向传播
  10. iptable防火墙流程图
  11. 如何在SQL Server中索引外键列
  12. 手机当中的wifi功能是什么意思?
  13. 「知识蒸馏」最新2022研究综述
  14. 计算机与通信学院方阵解说词,方阵解说词
  15. Java 五子棋 包含强大人机 步骤流程 包含源码
  16. Pytorch|YOWO原理及代码详解(二)
  17. 【JavaScript】17 - DOM
  18. VUE3 子传父 父传子 双向传递
  19. git生成公钥的步骤
  20. (精华2020年6月9日更新)Angular实战篇 axio的封装

热门文章

  1. Crowd自定义插件启动的主要流程
  2. springboot实现增量备份_增量同步-spring batch(6)动态参数绑定与增量同步
  3. 贴片电阻电容命名及封装
  4. 【重装win10系统】使用软碟通制作启动盘
  5. DAZ的下载安装及其汉化使用(遇到的一些问题)
  6. UE4 外部字体导入
  7. 键盘拆开重新安装步骤_键盘按键被拆了怎么办 电脑键盘怎么安装【详细介绍】...
  8. 通过OneDrive实现office多人协同
  9. 龙尚科技借力中国移动布局物联网“大连接”
  10. GB/T19001-2008/ISO 9001:2008条款图解