`

android不死服务的实现方法

阅读更多
大部分应用在手机长按home键删除最近程序时,进程会被杀掉,本文将实现一个不死的service,
首先,看入口程序:
MainActivity
package where.com.notkillservicedemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PackageManager packageManager = this.getPackageManager();
        ComponentName componentName = new ComponentName(this, MainActivity.class);
        //隐藏APP桌面图标并且不会在最近使用程序中找到
        packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



其中最重要的是packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
执行此代码后,应用在桌面的图标会被隐藏,且长按手机home键不会查看到该程序,所以也就无法杀死进程。当然,从设置里面还是可以强制杀死的,任何应用都不例外。
相反,  packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
                    PackageManager.DONT_KILL_APP);
就是显示应用桌面图标并且可以长按手机home键中找到该程序,从而可以将APP进程杀死。

当然我们还要有一个服务来为我们做事,
MainService
package where.com.notkillservicedemo;

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

import java.util.Timer;
import java.util.TimerTask;

public class MainService extends Service {
    public final static String TAG = "MainService";

    private  Timer timer = new Timer();
    private  class MyTask extends TimerTask {
        @Override
        public void run() {
          Log.e(TAG,"1111");
        }
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"onStartCommand");
        timer.schedule(new MyTask(),0,2000);
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy");
    }

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



除此之外要想保证服务一直存在,可以在用户最常按的电源键上做文章,因此我们需要一个广播接收器
BootBroadcastReceiver
package where.com.notkillservicedemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
 * 开机自启,按键启动
 */
public class BootBroadcastReceiver extends BroadcastReceiver {
    public static final String TAG = BootBroadcastReceiver.class.getSimpleName();
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "BootBroadcastReceiver onReceive");
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) || intent.getAction().equals(Intent.ACTION_SCREEN_ON) ||
                intent.getAction().equals(Intent.ACTION_SCREEN_OFF) || intent.getAction().equals(Intent.ACTION_USER_PRESENT) || android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
            Log.e(TAG, "action=" + intent.getAction());
            Intent ootStartIntent = new Intent(context, MainService.class);
            context.startService(ootStartIntent);
        }
    }

}


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="where.com.notkillservicedemo" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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 android:name=".MainService"/>
        <receiver android:name=".BootBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.media.AUDIO_BECOMING_NOISY" />
                <action android:name="android.intent.action.SCREEN_ON" />
                <action android:name="android.intent.action.SCREEN_OFF" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>


分享到:
评论

相关推荐

    Android不死Service

    "Android不死Service"这个概念通常指的是设计一种Service,即使在用户手动停止或者被第三方清理工具清理后,也能尽快自动重启,确保服务的连续性。这种Service的实现涉及对Android进程生命周期的理解以及巧妙地利用...

    android杀不死的app

    杀不死服务实现原理: 1:Android一个app可以启动2个进程 2:进程A与进程B互相守护 3:进程A时刻盯着进程B,通用进程B也时刻盯着进程B 4:进程之间互相盯着,需要用到IPC进程间通信技术(也就是Binder机制AIDL 5:...

    android后台保持不死

    用本例子是不断保持后台唤醒的例子源码,这是修改之后的,安装之后就能不断的唤醒,实现后台service持续运行,并且唤醒之后进入自定义界面,4.2.2测试唤醒的时候程序可以直接绕过屏幕锁但是点一下还是会出现锁屏界面...

    android杀不死服务一种实现,能过保证第三方软件和系统杀不死他,很好用哦

    实现Android中的"不死服务"主要涉及到以下几点: 1. **Service生命周期管理**: - `onCreate()`: 当服务首次创建时调用,适合进行初始化操作。 - `onStartCommand()`: 接收到`startService()`请求时调用,返回值...

    Android 实现双守护进程,保证不被杀死 源码

    本文将深入探讨如何在Android中实现双守护进程,以及如何做到“不死”和“免杀”。 首先,理解Android进程生命周期是关键。Android系统会根据内存状况和用户交互情况动态管理应用进程,当系统资源紧张时,后台进程...

    Android Service 服务不被杀死的妙招

    尽管IntentService会在任务完成后自动停止,但如果结合上述的一些技巧,仍然可以实现类似“不被杀死”的效果。 综上所述,通过组合使用这些策略,开发者可以显著提高Service在Android系统中的生存能力,确保后台...

    进程保活比较全面,适用于当下android8.0及以下

    根据描述中的信息,提供的`DNProcess`压缩包可能包含了一些示例代码,演示了四种不同的进程保活和拉活的实现方法。 1. **服务(Service)**:Android服务是运行在后台的一种组件,可以长时间执行任务。我们可以通过...

    Android多进程通讯AIDL实现客户端回调

    然而,在某些情况下,如后台服务、插件化开发或者大型应用模块化等场景,我们可能需要实现多进程间的通信。这时,Android Interface Definition Language (AIDL) 就起到了关键作用。AIDL是一种接口定义语言,用于...

    Android多进程通讯AIDL传递Parcelable对象

    在某些场景下,比如服务、广播接收器等组件需要在不同的进程中运行,或者我们希望实现一个插件化架构,这时就需要用到Android的多进程通信。AIDL(Android Interface Definition Language)是Android提供的一种接口...

    Android多进程通讯AIDLDemo

    在Android系统中,多进程通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。在大型复杂的应用场景下,为了提高程序的稳定性和性能,有时我们需要将服务或者部分功能模块运行在...

    Android可编辑Spinner

    总的来说,Android可编辑Spinner是通过自定义Adapter和View来实现的,它结合了选择和输入两种交互方式,增加了用户操作的灵活性,是Android开发中提升用户体验的一个实用技巧。开发者在实现这一功能时,需要考虑数据...

    Android Service那些事1

    5. **服务常驻与不死问题**: 保持Service常驻的常见策略包括提高代码质量以防止崩溃,设置监控服务的其他Service(称为“看门狗”),或者使用第三方库。然而,Android系统为了优化性能,可能会在内存紧张时杀死...

    Android 展开收缩Demo

    "Android 展开收缩Demo"是一个典型的实例,它展示了如何在Android应用中实现元素的展开和收缩动画。这种动画效果常见于下拉菜单、折叠列表或者任何需要动态改变大小或可见性的界面元素中。 在Android中,有两种主要...

    Android实现与支付宝对接

    本小程序是一个支付宝控件接口示例,当进入支付宝页面的时候点击所要支付的内容时会弹出提示框问是否安装支付宝支付服务,用户可以选择是否可以安装,只有安装后才可以支付,大家可以多多学习里面的编写思想,界面...

    android 程序自动更新

    在Android应用程序开发中,实现程序自动更新是一项重要的功能,它能确保用户始终使用最新、最安全的版本。...通过学习和理解上述提供的资源,开发者可以更好地掌握自动更新的实现方法并将其应用于自己的项目中。

    基于Android+API的人脸检测论文

    #### 实现方法 文章详细介绍了实现过程中的关键技术点,包括但不限于: - **图像预处理**:为了提高检测效率,通常需要对原始图像进行缩放、灰度化等预处理步骤。 - **特征提取**:利用Haar特征等方法从图像中提取...

    Android中文API合集+开发者指南 最新版 2012-6

    2. **库和工具**:包括各种库(如SQLite数据库、OpenGL ES、多媒体支持库等)和开发工具(如Android SDK、ADT插件等),开发者可以利用这些工具实现更丰富的功能。 3. **开发者服务**:如Google Play服务,提供地图...

Global site tag (gtag.js) - Google Analytics