`
yidongkaifa
  • 浏览: 4061918 次
文章分类
社区版块
存档分类
最新评论

Android中如何做到Service被关闭后又自动启动

 
阅读更多

首先要说的是,用户可能把这种做法视为流氓软件。大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算。

我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。

先简单介绍,一会儿会贴上全部代码。

如何做到开机启动?

这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。

那如何做到启动一个Service,并且在用户关闭后能自动又启动了呢?

一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户能够在服务里看到这个Service是常驻的。如果用户很敏感,就会停止该Service,甚至直接卸载掉相关的应用。那么,怎样才能定期实现某功能,又不让用户直接看到这个Service呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,做完事情以后关闭掉Service就可以了。

还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、Service等等这些概念的同学可以百度一下。

package com.arui.framework.android.daemonservice;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;

public class BootBroadcast extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent mintent) {

		if (Intent.ACTION_BOOT_COMPLETED.equals(mintent.getAction())) {
			// 启动完成
			Intent intent = new Intent(context, Alarmreceiver.class);
			intent.setAction("arui.alarm.action");
			PendingIntent sender = PendingIntent.getBroadcast(context, 0,
					intent, 0);
			long firstime = SystemClock.elapsedRealtime();
			AlarmManager am = (AlarmManager) context
					.getSystemService(Context.ALARM_SERVICE);

			// 10秒一个周期,不停的发送广播
			am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime,
					10 * 1000, sender);
		}

	}
}


package com.arui.framework.android.daemonservice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class Alarmreceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {

		if (intent.getAction().equals("arui.alarm.action")) {
			Intent i = new Intent();
			i.setClass(context, DaemonService.class);
			// 启动service 
			// 多次调用startService并不会启动多个service 而是会多次调用onStart
			context.startService(i);
		}
	}
}


package com.arui.framework.android.daemonservice;

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

public class DaemonService extends Service {

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

    @Override
    public void onCreate() {
    	super.onCreate();
    	Log.v("=========", "***** DaemonService *****: onCreate");
    }

    @Override
    public void onStart(Intent intent, int startId) {
    	Log.v("=========", "***** DaemonService *****: onStart");
    	// 这里可以做Service该做的事
    }
}


下面是manifest文件的代码。

		<receiver 
			android:name=" com.arui.framework.android.daemonservice.BootBroadcast"
			android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
			<intent-filter>
				<action android:name="android.intent.action.BOOT_COMPLETED" />
			</intent-filter>
		</receiver>
		<receiver 
			android:name=" com.arui.framework.android.daemonservice.Alarmreceiver" >
			<intent-filter>
				<action android:name="arui.alarm.action" />
			</intent-filter>
		</receiver>
        <service
            android:name="com.arui.framework.android.daemonservice.DaemonService" >
        </service>



继续讨论这个问题。

如果用户停止整个应用(在管理应用程序中停止应用,或者第三方软件停止整个应用),此时整个进程被杀死,所有的服务自然也被杀死了,timmer,或者alarmManager也就停止了。此时就不会再定期启动服务了。

那么,怎么才能做到,用户或者第三方软件无法停止整个应用呢。我们可以再注册一个系统级别的监听(BroadcastReceiver),来监听系统级别的消息,再次启动timmer,或者alarmManager。这样,即使应用被杀死了,隔一段时间,应用还会自动启动。具体的,就不在这里展开了。

---------------------------------------------------------------------------

GL(arui319)

http://blog.csdn.net/arui319

<本文可以转载,但是请保留以上作者信息。谢谢。>

---------------------------------------------------------------------------

分享到:
评论

相关推荐

    解析Android中如何做到Service被关闭后又自动启动的实现方法

    有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种...

    安卓后台保活服务service,自动重启APP

    安卓后台保活服务service,自动重启APP

    Android代码-android-UCToast

    本项目模拟实现该功能,即:开机自动启动的 Service 监听剪切板。复制之后,在屏幕顶部显示一个悬浮窗,显示剪贴板内容。点击悬浮窗,跳转到 Activity 页面显示。 兼容到 API level 9。 包含以下几个小功能点: ...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    实验四-Android基本组件交互实验.doc

    startActivityForResult ——跳转到下一个Activity,而当这个Activity被关闭以后,自动跳转前一个Activity ,并调用onActivityResult( )方法,参数为Intent和requestcode 2. Intent Android基本的设计理念是鼓励...

    疯狂Android讲义源码

     4.1.3 启动、关闭Activity 179  4.1.4 使用Bundle在Activity之间  交换数据 181  4.1.5 启动其他Activity并返回结果 185  4.2 Activity的回调机制 189  4.3 Activity的生命周期 190  4.3.1 Activity的生命...

    Android powermanger wakelock

    注:在PowerManagerService 类中没有实现nativeAcquireWakeLock,其实现体在 frameworks/base/core/jni/android_os_Power.cpp中,所以nativeAcquireWakeLock()方法时会调用JNI下的实现方法。 3).JNI层的实现 ...

    Google Android SDK开发范例大全(第3版) 1/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 4/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 3/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    Google Android SDK开发范例大全(第3版) 5/5

    全书共分11章,主要以范例集的方式来讲述Android的知识点,详细介绍了开发Android的人机交互界面、Android常用的开发控件、Android手机收发短信等通信服务、开发Android手机的自动服务功能和娱乐多媒体功能以及整合...

    疯狂Android讲义.part2

    4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 ...

    疯狂Android讲义.part1

    4.1.3 启动、关闭Activity 179 4.1.4 使用Bundle在Activity之间 交换数据 181 4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 ...

    Android开发之AlarmManager的用法详解

    Android中的AlarmManager实质上是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver)。 一、概述: 该类提供一种访问系统闹钟...

    Android开发资料合集-World版!

    9.86、ANDROID自动化测试初探 324 9.86.1、捕获Activity上的Element 324 9.86.2、Hierarchyviewer 捕获Element的 328 9.86.3、架构实现 330 9.86.4、模拟键盘鼠标事件(Socket+Instrumentation实现) 332 9.86.5、再...

Global site tag (gtag.js) - Google Analytics