精华内容
下载资源
问答
  • Android 实现保活方案

    2020-06-30 14:51:54
    推荐一个开源框架 https://github.com/xingda920813/HelloDaemon
    展开全文
  • 主要介绍了Android 后台运行白名单实现保活,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 实现后台定位功能。 实现方法: 核心是创建了浮动层,执行定时任务。 @Override public void onCreate() { super.onCreate(); //API 18以下,直接发送Notification并将其置为前台 if (Build.VERSION.SDK_INT &...

    预期目标:

    实现后台定位功能。

    实现方法:

    核心是一个前台进程,拥有正在“前台”运行的 Service(服务已调用 startForeground())。

    	public static final int NOTIFICATION_ID = 0x11;
    
    @Override
    public void onCreate() {
        super.onCreate();
        //API 18以下,直接发送Notification并将其置为前台
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
            startForeground(NOTIFICATION_ID, new Notification());
        } else {
            //API 18以上,发送Notification并将其置为前台后,启动InnerService
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            startForeground(NOTIFICATION_ID, builder.build());
            startService(new Intent(this, InnerService.class));
        }
        // do what you want
    }
    
    public static class InnerService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            //发送与KeepLiveService中ID相同的Notification,然后将其取消并取消自己的前台显示
            Notification.Builder builder = new Notification.Builder(this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            startForeground(NOTIFICATION_ID, builder.build());
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    stopForeground(true);
                    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                    manager.cancel(NOTIFICATION_ID);
                    stopSelf();
                }
            }, 100);
        }
    }
    





    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    展开全文
  • Android 添加白名单实现保活

    千次阅读 热门讨论 2020-07-03 11:28:41
    Android 白名单保活 最近有遇到保活的需求,一开始想到的就是之前的黑科技保活比如像素Activity,播放无声MP3,双进程等方法,但是随着Android系统的更新,这些非常规的方法或多或少都已经失效了。作为研发虽然很不乐意...

    Android 白名单保活

    最近有遇到保活的需求,一开始想到的就是之前的黑科技保活比如像素Activity,播放无声MP3,双进程等方法,但是随着Android系统的更新,这些非常规的方法或多或少都已经失效了。作为研发虽然很不乐意做这种功能,但是产品是不是提一句,没办法只有硬着头皮做了。接下来就是愉快的码代码。

    代码下载地址

    在这里插入图片描述

    1.方法一常驻通知栏

    对于部分APP来说,常驻通知栏就能达到基本保活的需求,其实就是在APP启动的时候创建一Service,重写onStartCommand并返回1将应用设置为前台应用;当然通知栏还要适配一下Android O

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("Demo","应用包名"+"demo", NotificationManager.IMPORTANCE_LOW);
            assert notificationManager != null;
            notificationManager.createNotificationChannel(channel);
        }
        startForeground(1,getNotification());
        return START_STICKY;
    }
    
    private Notification getNotification() {
        Intent contentIntent = new Intent();
        contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        contentIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        contentIntent.setData(Uri.fromParts("package", "应用包名", null));
        Notification.Builder builder = new Notification.Builder(this)
            .setSmallIcon(R.mipmap.logo_icon_xiaowo)
            .setContentIntent(PendingIntent.getActivity(this, 0, contentIntent, 0))
            .setContentTitle("\""+"应用包名"+"\"正在运行")
            .setContentText("触摸即可了解详情或停止应用");
        //设置Notification的ChannelID,否则不能正常显示
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder.setChannelId("Demo");
        }
        return builder.build();
    }
    

    2.添加白名单实现保活

    虽然说通知栏能实现基本的保活,但是并不达到产品的需求,所以只能继续尝试其他方法了,在将所有黑科技方法都尝试过一遍之后发现随着Android系统的更新,这些方法或多或少都失效了。后来想起来之前在浏览洪洋博客的时候有一篇写到添加Android白名单实现保活的文章,就又翻出来看了一下,虽然只支持Android M 及以上版本,同时添加白名单会增加耗电量,但是因为用户基本都是固定客户所以最终也就采用了此方法。

    虽然我所需要适配的手机型号并没有这么多,但是还是全部列举下来了,万一以后需要呢~ 哈哈:

    final static String  IS_HUAWEI = "isHuawei"; //华为
    final static String  IS_XIAOMI = "isXiaomi"; //小米
    final static String  IS_OPPO = "isOppo";  //oppo
    final static String  IS_VIVO = "isVivo"; //vivo
    final static String  IS_MEIZU = "isMeizu"; //魅族
    final static String  IS_SAMSUNG = "isSamsung"; //三星
    final static String  IS_LETV = "isLetv"; //乐视
    final static String  IS_SMARTISAN = "isSmartisan"; //锤子
    

    1.判断应用是否添加在白名单之中

    @RequiresApi(Build.VERSION_CODES.M)
    public boolean isIgnoringBatteryOptimizations(Context context){
        boolean isIgnoring = false;
        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    
        if (powerManager != null)
            isIgnoring = powerManager.isIgnoringBatteryOptimizations("包名");
    
         return isIgnoring;
    }
    

    2.如果不存在则申请加入白名单,使用弹框引导用户

    public void requestIgnoreBatteryOptimizations(Context context){
        try {
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + "包名"));
            context.startActivity(intent);
        }catch (Exception e){
                e.printStackTrace();
        }
    }
    

    3.因为需求,所以我在onActivityResult方法中再一次对应用进行判断,如果应用还是不存在于白名单中则继续申请;同时也给予了用户主动跳转到设置页面去添加的方法,因为不同的手机产商后台管理不一样,所以博主也定义两个跳转的方法,同时也测试了大部分主流Android手机厂商,这让我们这些搬砖的可以直接使用。

    /**
    * 跳转到指定应用的首页
    */
    public void showActivity(String packageName,Context context){
        Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
        context.startActivity(intent);
    }
    /**
    *  跳转到指定应用的指定页面
    * */
    public void showActivity(String packageName,String activityDir,Context context){
        Intent intent = new Intent();
        intent.setComponent(new ComponentName(packageName, activityDir));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
    

    4.这时候我们需要对手机厂商进行判断

    //判断手机厂商
    public String checkPhoneFirm(){
        String phoneState = Build.BRAND.toLowerCase(); //获取手机厂商
        if (phoneState.equals("huawei") || phoneState.equals("honor"))
            return PhoneConstant.IS_HUAWEI;
        else if (phoneState.equals("xiaomi") && Build.BRAND != null)
            return PhoneConstant.IS_XIAOMI;
        else if (phoneState.equals("oppo") && Build.BRAND != null)
            return PhoneConstant.IS_OPPO;
        else if (phoneState.equals("vivo") && Build.BRAND != null)
            return PhoneConstant.IS_VIVO;
        else if (phoneState.equals("meizu") && Build.BRAND != null)
            return PhoneConstant.IS_MEIZU;
        else if (phoneState.equals("samsung") && Build.BRAND != null)
            return PhoneConstant.IS_SAMSUNG;
        else if (phoneState.equals("letv") && Build.BRAND != null)
            return PhoneConstant.IS_LETV;
        else if (phoneState.equals("smartisan") && Build.BRAND != null)
            return PhoneConstant.IS_SMARTISAN;
    
        return "";
    }
    

    5.在知道手机厂商之后我们就可以跳转到对应的后台进行设置了

    //前往设置管理
    public void  gotoWhiteListSetting(Context context){
        if (checkPhoneFirm().equals(PhoneConstant.IS_HUAWEI)){
            try {
                showActivity("com.huawei.systemmanager","com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity",context);
            }catch (Exception e){
                showActivity("com.huawei.systemmanager",
                            "com.huawei.systemmanager.optimize.bootstart.BootStartActivity",context);
            }
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_XIAOMI)){
                showActivity("com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity",context);
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_OPPO)){
            //oppo:操作步骤:权限隐私 -> 自启动管理 -> 允许应用自启动
            try {
                 showActivity("com.coloros.phonemanager",context);
            } catch (Exception e) {
                 try {
                    showActivity("com.oppo.safe",context);
                 } catch (Exception e2) {
                    try {
                        showActivity("com.coloros.oppoguardelf", context);
                    } catch (Exception e3) {
                        showActivity("com.coloros.safecenter", context);
                    }
                }
        }
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_VIVO)){
            //vivo:操作步骤:权限管理 -> 自启动 -> 允许应用自启动
            showActivity("com.iqoo.secure", context);
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_MEIZU)){
            //魅族:操作步骤:权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行
            showActivity("com.meizu.safe", context);
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_SAMSUNG)){
            //三星:操作步骤:自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用
            try {
                showActivity("com.samsung.android.sm_cn",context);
            } catch (Exception e) {
                showActivity("com.samsung.android.sm",context);
            }
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_LETV)){
            //乐视:操作步骤:自启动管理 -> 允许应用自启动
                showActivity("com.letv.android.letvsafe","com.letv.android.letvsafe.AutobootManageActivity", context);
        }else if (checkPhoneFirm().equals(PhoneConstant.IS_SMARTISAN)){
            //锤子:操作步骤:权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动
            showActivity("com.smartisanos.security", context );
        }
    }
    

    到这里白名单保活就结束了。做个笔记记录一下~

    工具类下载地址:
    PhoneUtil下载地址

    展开全文
  • Android进程保活·1像素且透明Activity提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/processKeep_Activity 首先你要知道Android中的进程以及它的优先级,下面来说明...

    Android进程保活·1像素且透明Activity提升App进程优先级

    Android进程


    此文章代码Github上有提交:https://github.com/NorthernBrain/processKeep_Activity


    首先你要知道Android中的进程以及它的优先级,下面来说明它进程
    1. 前台进程 (Foreground process)
    2. 可见进程 (Visible process)
    服务进程 (Service process) 后台进程 (Background process) 空进程 (Empty process)

    下面进行解释:


    前台进程(Foreground process):
    用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:
    • 托管用户正在交互的 Activity(已调用 Activity 的 onResume() 方法)
    • 托管某个 Service,后者绑定到用户正在交互的 Activity
    • 托管正在“前台”运行的 Service(服务已调用 startForeground())
    • 托管正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
    • 托管正执行其 onReceive() 方法的 BroadcastReceiver
            通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。


    可见进程 (Visible process):
    没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:
    • 托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
    • 托管绑定到可见(或前台)Activity 的 Service。

    可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。


    服务进程 (Service process):
    正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。


    后台进程 (Service process):
    包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。


    空进程 (Empty process):
    不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。


    进程优先级:
    首先空进程是最先被回收的,其次便是后台进程,依次往上,前台进程是最后才会被结束。


    Android进程保活

    有很多种方法可以实现Android的进程保活,比如通过 1像素且透明Activity提升App进程优先级通过设置前台Service提升App进程优先级Java层的双进程拉活JobScheduler实现NDK双进程守护使用账户同步拉活workmanager实现

    下面这幅图,说明的是:
    • 红色部分是容易被回收的进程,属于android进程
    • 绿色部分是较难被回收的进程,属于android进程
    • 其他部分则不是android进程,也不会被系统回收,一般是ROM自带的app和服务才能拥有

    本篇文章介绍的是进程第一种方式:

    • 1像素且透明Activity提升App进程优先级


    1像素且透明Activity提升App进程优先级:


    首先创建KeepLiveActivity.java继承自AppCompatActivity,这就是透明的Activity:↓

    public class KeepLiveActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            Log.d("KeepLiveActivity","开启KeepLiveActivity");
    
            //左上角显示
            Window window = getWindow();
            window.setGravity(Gravity.START|Gravity.TOP);
    
            //设置为1像素大小
            WindowManager.LayoutParams params = window.getAttributes();
            params.x = 0;
            params.y = 0;
            params.width = 1;
            params.height = 1;
            window.setAttributes(params);
    
            KeepLiveManager.getInstance().setKeepLiveActivity(this);
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d("KeepLiveActivity","关闭KeepLiveActivity");
        }
    }
    
    复制代码

    样式文件中添加:↓
    <style name="KeepLiveTheme" parent="AppTheme">
        <item name="android:windowBackground">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
    复制代码

    清单文件中注册KeepLiveActivity:↓
    <activity android:name=".KeepLiveActivity"
        android:excludeFromRecents="true"
        android:exported="false"
        android:finishOnTaskLaunch="false"
        android:launchMode="singleInstance"
        android:theme="@style/KeepLiveTheme"/>
    复制代码

    创建KeepLiveManager独生子模式(单例):↓
    public class KeepLiveManager {
        private static final KeepLiveManager ourInstance = new KeepLiveManager();
    
        public static KeepLiveManager getInstance() {
            return ourInstance;
        }
    
        private KeepLiveManager() {
        }
    
        //弱引用,防止内存泄漏
        private WeakReference<KeepLiveActivity> reference;
    
        private KeepLiveReceiver receiver;
    
        public void setKeepLiveActivity(KeepLiveActivity activity) {
            reference = new WeakReference<>(activity);
        }
    
        //开启透明Activity
        public void startKeepLiveActivity(Context context) {
            Intent intent = new Intent(context, KeepLiveActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    
        //关闭透明Activity
        public void finishKeepLiveActivity() {
            if (reference != null && reference.get() != null) {
                reference.get().finish();
            }
        }
    
        //注册广播
        public void registerKeepLiveReceiver(Context context) {
            receiver = new KeepLiveReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            filter.addAction(Intent.ACTION_SCREEN_ON);
            context.registerReceiver(receiver, filter);
        }
    
        //反注册
        public void unregisterKeepLiveReceiver(Context context){
            if(receiver != null){
                context.unregisterReceiver(receiver);
            }
        }
    }
    
    复制代码

    创建KeepLiveReceiver继承自BroadcastReceiver(广播接收者):↓
    /*
     * 广播接收者监听屏幕开启和熄灭
     * */
    public class KeepLiveReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
    
                //屏幕关闭,开启透明Activity
                KeepLiveManager.getInstance().startKeepLiveActivity(context);
    
            } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
    
                //屏幕开启,关闭透明Activity
                KeepLiveManager.getInstance().finishKeepLiveActivity();
    
            }
        }
    }
    
    复制代码

    最后在MainActivity调用就行:↓
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //1像素且透明Activity提升App进程优先级
            KeepLiveManager.getInstance().registerKeepLiveReceiver(this);
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //反注册防止内存泄漏
            KeepLiveManager.getInstance().unregisterKeepLiveReceiver(this);
        }
    }
    
    复制代码

    转载于:https://juejin.im/post/5c1b89baf265da61616ea8af

    展开全文
  • Android进程保活·设置前台Service,提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/processKeep_Service/tree/master 首先你要知道Android中的进程以及它的优先级,...
  • Android保活实现方案梳理

    千次阅读 2019-07-19 10:42:10
    最近查看进程保活的各种资料,实现方式无非就那么几种,可以参考上面的资料链接,本篇博文对这些实现进行了分析和测试,并把从中体会到的知识点做个总结汇总,算是加深相关知识的理解。 1像素Activity 该方案适用...
  • Android进程保活·设置前台Service,提升App进程优先级 Android进程 此文章代码Github上有提交: 首先你要知道Android中的进程以及它的优先级,下面来说明它进程 前台进程 (Foreground process) 可见进程 ...
  • Android进程保活 Android进程 首先你要知道Android中的进程以及它的优先级,下面来说明它进程 前台进程 (Foreground process) 可见进程 (Visible process) 服务进程 (Service process) 后台进程 (Background ...
  • Android 进程保活

    2019-11-12 17:18:25
    最近查看进程保活的各种资料,实现方式无非就那么几种,可以参考上面的资料链接,本篇博文对这些实现进行了分析和测试,并把从中体会到的知识点做个总结汇总,算是加深相关知识的理解。 本篇博文以github的一个库为...
  • android 进程保活

    2018-10-31 17:38:11
    android 进程保活 , 保证后台提交数据的服务一 直运行
  • Android 后台运行白名单,优雅实现保活 保活现状 我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低...
  • Android 实现进程保活

    千次阅读 2019-08-21 19:49:22
    网上大致有以下几种方法:1、将Service设置为前台进程2、在service的onStartCommand方法里返回 STATR_STICK3、添加Manifest文件属性值为android:persistent=“true”4、覆写Service的onDestroy方法5、添加广播监听...
  • 众所周知,日活率是一款App的核心绩效指标,日活量不仅反应了应用...早期的Android系统不完善,从而导致有很多空子可以钻,它们用着各种各样的方式进行保活,长期以来被人诟病耗电、卡顿,也滋生了很多流氓应用,拖垮A

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,549
精华内容 2,219
关键字:

安卓实现保活