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月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
174 2
|
1月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
89 1
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
140 0
安卓项目:app注册/登录界面设计
|
2月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
9天前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
1月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
49 2
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
121 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
1月前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
159 2
|
2月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
103 3