如何写一个不会被系统自动 kill 的程序(android开发)(已封装)

我们写的程序在手机上面运行的好好的,一旦打开应用过多,手机内存不够的时候,系统首先会 kill 掉我们的程序。kill 在后台运行的service。

我查了很多方法,什么提高级别,什么把service设置成前台组件,都不管用。

后来想到一个方法,屡试不爽。

原理:activity 和 service 是运行在同一个线程中的,只要不让这个线程无操作太久就行。也就是每隔一段时间就运行一下这个UI线程。优化:如果手机当前打开的activity是自身,那就忽略。

代码:

package com.example.runalways;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //开启service
        Intent intent = new Intent();
        intent.setClass(this, MyService.class);
        this.startService(intent);
    }
}

package com.example.runalways;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {
	private RunAlways runAlways;

	@Override
	public void onCreate() {
		//只要在service中new一个对象,然后start方法
		runAlways = new RunAlways(this);
		runAlways.start();
	}
	
	@Override
	public void onDestroy() {
		//最后在onDestory中close就行
		runAlways.close();
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
}


manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.runalways"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <!-- 加入权限,获取当前正在运行的activity用 -->
    <uses-permission android:name="android.permission.GET_TASKS"/>
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.runalways.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>
        
    	<!-- 注册service -->    
        <service android:name="com.example.runalways.MyService"></service>
    
    </application>

</manifest>


已封装好的类:直接用就行

package com.example.runalways;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

/**
 * 这是一个封装好的类,
 * 要实现不被系统 kill 掉的service,
 * 只要在service中new一个对象,然后start方法,最后在onDestory中close就行
 * 注意:要加入权限 <uses-permission android:name="android.permission.GET_TASKS"/>
 * @author LinZhiquan
 *
 */
public class RunAlways {
	private Context context;
	private BroadcastReceiver myReceiver;
	/** 当service关闭的时候停止线程 */
	private boolean flag_runnable = true;

	public RunAlways(Context context) {
		this.context = context;

		myReceiver = new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
	}
	
	/**
	 * 开启线程
	 */
	public void start() {
		// 注册广播接收器,当当前运行的程序不是自身,则让service运行一下
		IntentFilter filter = new IntentFilter();
		filter.addAction("com.example.runalways.notSelf");
		context.registerReceiver(myReceiver, filter);
		
		// 开启线程,隔一段时间就判断一下当前运行的程序是不是自身,如果不是,则发送广播
		new Thread(new MyRunnable()).start();
	}

	/**
	 * 关闭,取消注册接收器以及停止线程
	 */
	public void close() {
		// 记得取消广播注册,和关闭线程
		context.unregisterReceiver(myReceiver);
		this.flag_runnable = false;
	}

	private class MyRunnable implements Runnable {
		@Override
		public void run() {
			while (flag_runnable) {
				try {
					Thread.sleep(3000);

					// 获取当前运行的Activity
					ActivityManager am = (ActivityManager) context
							.getSystemService(Context.ACTIVITY_SERVICE);
					ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
					String pkgName = cn.getPackageName();

					if (!pkgName.equals(context.getPackageName())) {

						Intent intent = new Intent();
						intent.setAction("com.example.runalways.notSelf");
						context.sendBroadcast(intent);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}




这个功能可以通过在程序中添加一个守护进程来实现。具体实现步骤如下: 1. 在程序中添加一个守护进程,该进程负责监控程序是否被终止。 2. 如果程序被终止,守护进程会自动启动该程序。 3. 程序运行时需要记录其进程ID,以便守护进程能够监控该进程的状态。 4. 守护进程可以使用操作系统提供的API函数来监控进程状态,例如在Linux系统中可以使用kill函数来检测进程是否存活。 下面是一个简单的示例代码,演示如何使用守护进程来实现该功能: ```c++ #include <iostream> #include <unistd.h> #include <signal.h> #include <sys/wait.h> using namespace std; void signal_handler(int sig) { pid_t pid = fork(); if (pid == -1) { cerr << "fork failed" << endl; } else if (pid == 0) { execl("/path/to/program", "program", NULL); cerr << "execl failed" << endl; } } int main() { pid_t pid = fork(); if (pid == -1) { cerr << "fork failed" << endl; return 1; } else if (pid == 0) { // 子进程 signal(SIGTERM, signal_handler); while (true) { sleep(1); } } else { // 父进程 cout << "Process ID: " << pid << endl; while (true) { int status; pid_t result = waitpid(pid, &status, WNOHANG); if (result == -1) { cerr << "waitpid failed" << endl; return 1; } else if (result == 0) { // 进程仍在运行 sleep(1); } else { // 进程已终止,重新启动 pid = fork(); if (pid == -1) { cerr << "fork failed" << endl; return 1; } else if (pid == 0) { signal(SIGTERM, signal_handler); while (true) { sleep(1); } } else { cout << "Process ID: " << pid << endl; } } } } return 0; } ``` 该程序首先创建一个守护进程,然后在父进程中监控该进程的状态。如果守护进程被终止,父进程会检测到该事件,并重新启动守护进程。需要注意的是,在Linux系统中,父进程需要使用waitpid函数来监控子进程的状态。如果子进程已经终止,waitpid函数会立即返回,否则会阻塞等待子进程终止。使用WNOHANG参数可以让waitpid函数在子进程未终止时立即返回。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值