Android进程守护,让APP在系统内存中常驻(二)

简介: Android进程守护,让APP在系统内存中常驻

  今天写一下用提高app的进程等级来实现应用保活。想看直接调用系统方法保活应用的可以点击Android进程守护,让APP在系统内存中常驻(一)进行跳转。

     一:第一种实现思路,创建广播接收者来监听系统关屏亮屏操作。当手机关屏时,显示一个透明的一像素的activity,此时用户时看不见的;当手机亮屏时,把这个activity给finish掉。好了,有了思路就开始实现吧。

          1.首先新建一个广播接收者:来判断当前的屏幕状态来进行一些操作。

public class AppBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
            AppReciver.getInstance().startApp(context);
        }else {
            AppReciver.getInstance().finishApp();
        }
    }
}

         2.创建一个1像素的activity。

@SuppressLint("RtlHardcoded")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_null);
        //设置1像素
        Window window = getWindow();
        window.setGravity(Gravity.LEFT | Gravity.TOP);
        WindowManager.LayoutParams params = window.getAttributes();
        params.x = 0;
        params.y = 0;
        params.height = 1;
        params.width = 1;
        window.setAttributes(params);
        //用来给单例传过去activity,能让它finish掉。
        AppReciver.getInstance().setActivity(this);
    }

       3.为这个活动创建一个空的透明的主题。

<style name="KeepLive" parent="AppTheme">
        <item name="windowBackground">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

       4.为这个活动修改AndroidManifest中的内容,把它单独放入一个栈中。让他使用刚刚为他创建的主题。

<activity android:name=".NullActivity"
            android:launchMode="singleInstance"
            android:theme="@style/KeepLive"/>

       5.创建一个单例,用来完成开始和结束活动任务的逻辑操作。


class AppReciver {
    private static final AppReciver ourInstance = new AppReciver();
    private WeakReference<NullActivity> weakReference;
    private AppReciver() {
    }
    static AppReciver getInstance() {
        return ourInstance;
    }
    public void startApp(Context context) {
        context.startActivity(new Intent(context, NullActivity.class));
    }
    public void registerReceiver(Context context) {
        AppBroadcastReceiver appBroadcastReceiver = new AppBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.SCREEN_OFF");
        intentFilter.addAction("android.intent.action.SCREEN_ON");
        intentFilter.addAction("android.intent.action.USER_PRESENT");
        context.registerReceiver(appBroadcastReceiver, intentFilter);
    }
    public void finishApp() {
        if (weakReference != null && weakReference.get() != null) {
            weakReference.get().finish();
        }
    }
    public void setActivity(NullActivity activity) {
        weakReference = new WeakReference(activity);
    }
}

         6.注意上面的单例中使用了WeakReference来保存activity。这里为了避免内存泄漏使用了弱引用。最后在活动中调用一下就完成了。


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.系统拉活service进程
        //startService(new Intent(this,StickService.class));
        //2.通过jobScheduler拉活
        //startJob();
        //3.通过bindService,通过ServiceConnection来拉活
        //bindService();
        //4.通过activity来提升app的进程等级
        AppReciver.getInstance().registerReceiver(this);
    }


      二:service提升app的进程等级


          1.首先新建一个服务。

public class ForegroundService extends Service {
    private static final int SERVICE_ID = 1;
    public ForegroundService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

        2.如果是安卓4.0以下可以直接构建一个空的通知。安卓8.0以上,通知需要设置channel ,还需要设置通知的重要级别 ,安卓9.0以上,通知会直接显示出来。所以要进行版本的判断,来实现通知的设置方式。4.0以下的可以直接通过下面一行代码调用。

if (Build.VERSION.SDK_INT < 18) {
            //安卓4.0以下可以直接构建一个空的通知。
            //设置成前台服务,并且去除通知栏消息
            startForeground(SERVICE_ID,new Notification());
        }

        3.安卓8.0以下的就需要先设置成前台服务,然后再去通过新的服务去除通知栏的消息。好了,废话不说,直接上代码。

else if (Build.VERSION.SDK_INT < 26) {
            //设置成前台服务
            startForeground(SERVICE_ID,new Notification());
            //并且去除通知栏消息
            startService(new Intent(this,InnerService.class));
        }

         4.InnerService直接写一个内部服务就行。在里面进行去除通知栏的消息。


private class InnerService extends Service{
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            startForeground(SERVICE_ID,new Notification());
            stopForeground(true);
            stopSelf();
            return super.onStartCommand(intent, flags, startId);
        }
    }

           5.下面是这个服务的完整代码。

public class ForegroundService extends Service {
    private static final int SERVICE_ID = 1;
    public ForegroundService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (Build.VERSION.SDK_INT < 18) {
            //安卓4.0以下可以直接构建一个空的通知。
            //设置成前台服务,并且去除通知栏消息
            startForeground(SERVICE_ID,new Notification());
        } else if (Build.VERSION.SDK_INT < 26) {
            //设置成前台服务
            startForeground(SERVICE_ID,new Notification());
            //并且去除通知栏消息
            startService(new Intent(this,InnerService.class));
        } else {
            //安卓8.0以上,通知需要设置channel
            //还需要设置通知的重要级别
            //安卓9.0以上,通知会直接显示出来。
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (manager!=null){
                NotificationChannel channel = new NotificationChannel("channel","xxx",NotificationManager.IMPORTANCE_NONE);
                manager.createNotificationChannel(channel);
                Notification notification = new NotificationCompat.Builder(this,"channel").build();
                startForeground(SERVICE_ID,notification);
            }
        }
        return super.onStartCommand(intent, flags, startId);
    }
    private class InnerService extends Service{
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            startForeground(SERVICE_ID,new Notification());
            stopForeground(true);
            stopSelf();
            return super.onStartCommand(intent, flags, startId);
        }
    }
}

          6.在活动中启动一下就大功告成了。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.系统拉活service进程
        //startService(new Intent(this,StickService.class));
        //2.通过jobScheduler拉活
        //startJob();
        //3.通过bindService,通过ServiceConnection来拉活
        //bindService();
        //4.通过activity来提升app的进程等级
        //AppReciver.getInstance().registerReceiver(this);
        //5.通过Service来提升app的进程等级
        startService(new Intent(this,ForegroundService.class));
    }


目录
相关文章
|
1月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
2月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
282 2
|
5天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
44 13
|
29天前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
17天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
18天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
80 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
66 16
|
24天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
66 1