首页 > 代码库 > 服务与控制界面(Activity)的交互---仿qq后台服务(一)

服务与控制界面(Activity)的交互---仿qq后台服务(一)

  qq的后台服务,在我们按2下返回键,退出应用app后,消息来了,会突破锁屏,点亮屏幕,看见消息弹出框,后面可以进行一系列的操作。qq的服务是不会被360杀死的,是属于我们所说的流氓软件,会在后台偷跑流量的,只有用户手动在应用程序里面关闭才行的。我所写的demo,暂时不会有这个流氓软件的功能的,以后如果有业务需求,也许会加上的,关于屏幕解锁,不同的手机的解锁方式是不同的迷宫解锁,密码解锁...但是系统解锁都是可以解的。还有就是因为急着出版本,所以这一版本暂时没有突破锁屏过后的弹出框,这个功能在下一版本会有的,我会继续更新的。废话也说了这么多了,上代码吧。

业务需求:

1.有个界面,上面有这几个元素:
 停止按钮
 开始按钮
 复位按钮
 进度条0%-100%
2.后台有个服务,包含以下逻辑:
 有个进度值,初始是0%,最小是0%,最大是100%
 初始状态是停止的,什么都不做
 收到开始命令后,每秒增加1%的进度
 收到停止命令后,停下进度增长,进度维持目前的数值,什么都不做
 收到复位命令后,将进度调整为0%
3.界面与服务的协作逻辑表达为用例如下:
 打开界面界面上什么都不动,进度条为0
 点开始,服务开始按内在逻辑走进度,并通知界面更新进度条控件
 点停止,服务中的进度逻辑停止
 如果在进度走到20%的时候,退出界面(Home键、返回、熄屏、返回+熄屏),等待10秒再进入,应看到进度条处在30%的地方,且仍旧在走
 停止时点复位,界面中的进度条应瞬间回到0%,且停留在0%
 进行时点复位,界面中的进度条应瞬间回到0%,且继续走

<span style="font-size:12px;">package com.example.localservice;

import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener, Ctroller {

	private static final String TAG = "MainActivity";
	private ProgressBar progressBar;
	private Button startBtn;
	private Button stopBtn;
	private Button resetBtn;
	private TextView tx;
	
	private Intent intent = new Intent();
	private UpdateReceiver updateReceiver;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		
		//动态注册广播接收器  
		updateReceiver = new UpdateReceiver();  
        IntentFilter intentFilter = new IntentFilter();  
        intentFilter.addAction("com.example.localservice.UPDATE");  
        registerReceiver(updateReceiver, intentFilter);  
		
		progressBar = (ProgressBar) findViewById(R.id.progressBar);
		startBtn = (Button) findViewById(R.id.start);
		stopBtn = (Button) findViewById(R.id.stop);
		resetBtn = (Button) findViewById(R.id.reset);
		tx = (TextView) findViewById(R.id.tx);
		startBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		resetBtn.setOnClickListener(this);
		
		Intent in = new Intent(this, MyService.class);
		startService(in);
		
		//开机发送广播,拿数据
		intent.setAction("com.example.localservice.NOTIFICATION");
		intent.putExtra("click", "data");
		sendBroadcast(intent);
		
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		
		case R.id.start:
			intent.setAction("com.example.localservice.NOTIFICATION");
			intent.putExtra("click", "start");
			sendBroadcast(intent);
			break;

		case R.id.stop:
			intent.setAction("com.example.localservice.NOTIFICATION");
			intent.putExtra("click", "stop");
			sendBroadcast(intent);
			break;
		case R.id.reset:
			intent.setAction("com.example.localservice.NOTIFICATION");
			intent.putExtra("click", "reset");
			sendBroadcast(intent);
			break;
		}

	}
	
	public class UpdateReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			 //拿到进度,更新UI  
            int progress = intent.getIntExtra("progress", 0);  
            progressBar.setProgress(progress); 
            tx.setText(progress + "%");
            if(progress % 10 == 0){
            	SoundManager.getInstance(context).playSound(SoundManager.NETERROR);
            }else{
            	SoundManager.getInstance(context).stopSound();
            }
            
            if(progress % 20 == 0){
            	lighten();
            }else {
            	
            }
            
		}
		
	}
	
	
	@Override
	protected void onPause() {
		super.onPause();
		MyService.IS_DESTORY = false;
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		MyService.IS_DESTORY = false;
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unregisterReceiver(updateReceiver);
		SoundManager.getInstance(this).stopSound();
		MyService.IS_DESTORY = true;
		Log.i(TAG, "------>>onDestroy");
	}
	
	
	
	
	/**
	 * 点亮屏幕
	 */
	public void lighten() {
		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

		if (!pm.isScreenOn()) {
			// 获取电源管理器对象
			PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
							| PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
			// 点亮屏幕
			wl.acquire();

			if (!MyService.IS_DESTORY) {
				// 解锁
				getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
			} else {
				// 获取电源管理器对象
				KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
				// 得到键盘锁管理器对象
				KeyguardLock kl = km.newKeyguardLock("unLock");
				// 解锁
				kl.disableKeyguard();

				// kl.reenableKeyguard();
				// 重新启用自动加锁
				// wl.release();
				// 释放
			}

		}
	}
	
	@Override
	public void dismissKeyguard() {
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
		
	}

	@Override
	public void runOnUI(Runnable run) {
		runOnUiThread(run);
		
	}

}</span>
<span style="font-size:12px;">package com.example.localservice;

import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.WindowManager;

public class MyService extends Service {

	public static final int MAX_PROGRESS = 100;
	private int progress = 0;
	private ServiceReciver serviceReciver;
	private int ok = 0;
	public static boolean IS_DESTORY = false;
	private Ctroller object;

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

	@Override
	public void onCreate() {
		super.onCreate();
		// 动态注册广播接收器
		serviceReciver = new ServiceReciver();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction("com.example.localservice.NOTIFICATION");
		registerReceiver(serviceReciver, intentFilter);

	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		unregisterReceiver(serviceReciver);
	}

	/**
	 * 模拟下载任务,每秒钟更新一次
	 */
	public void startDownLoad() {
		new Thread(new Runnable() {

			@Override
			public void run() {
				while (ok < MAX_PROGRESS) {
					ok += 1;
					progress += 1;
					// 发送Action为com.example.localservice.UPDATE的广播
					if(IS_DESTORY){
						Intent intent = new Intent(MyService.this, MainActivity.class);
						intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
						startActivity(intent);
						Intent in = new Intent();
						in.putExtra("progress", progress);
						in.setAction("com.example.localservice.UPDATE");
						sendBroadcast(in);
					}else {
						Intent in = new Intent();
						in.putExtra("progress", progress);
						in.setAction("com.example.localservice.UPDATE");
						sendBroadcast(in);
					}
					
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
//					if (progress % 20 == 0) {
//						lighten();
//						setBrightness();
//					}

				}

			}

		}).start();
	}

	public void stop() {
		Intent in = new Intent();
		in.putExtra("progress", progress);
		in.setAction("com.example.localservice.UPDATE");
		sendBroadcast(in);
	}

	public void reset() {
		progress = 0;
		Intent in = new Intent();
		in.putExtra("progress", progress);
		in.setAction("com.example.localservice.UPDATE");
		sendBroadcast(in);
	}

	public class ServiceReciver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			String extra = intent.getStringExtra("click");

			if ("data".equals(extra)) {
				Intent in = new Intent();
				in.putExtra("progress", progress);
				in.setAction("com.example.localservice.UPDATE");
				sendBroadcast(in);
			}
			if ("start".equals(extra)) {
				// myThread.start();
				ok = progress;
				startDownLoad();

			}
			if ("stop".equals(extra)) {
				ok = 101;
				stop();
			}
			if ("reset".equals(extra)) {
				reset();
			}
		}

	}

//	// 改变亮度
//	public static void SetLightness(Activity act, int value) {
//		try {
//			System.putInt(act.getContentResolver(), System.SCREEN_BRIGHTNESS,
//					value);
//			WindowManager.LayoutParams lp = act.getWindow().getAttributes();
//			lp.screenBrightness = (value <= 0 ? 1 : value) / 255f;
//			act.getWindow().setAttributes(lp);
//		} catch (Exception e) {
//			Toast.makeText(act, "无法改变亮度", Toast.LENGTH_SHORT).show();
//		}
//	}
//
//	// 获取亮度
//	public static int GetLightness(Activity act) {
//		return System.getInt(act.getContentResolver(),
//				System.SCREEN_BRIGHTNESS, -1);
//	}

	/**
	 * 点亮屏幕
	 */
	public void lighten() {
		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

		if (!pm.isScreenOn()) {
			// 获取电源管理器对象
			PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
							| PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
			// 点亮屏幕
			wl.acquire();

			if (!IS_DESTORY) {
				// 解锁
//				kl.disableKeyguard();
			} else {
				Intent intent = new Intent(this, MainActivity.class);
				intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				startActivity(intent);
				// 获取电源管理器对象
				KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
				// 得到键盘锁管理器对象
				KeyguardLock kl = km.newKeyguardLock("unLock");
				// 解锁
				kl.disableKeyguard();

				// kl.reenableKeyguard();
				// 重新启用自动加锁
				// wl.release();
				// 释放
			}

		}
	}

	/**
	 * 改变屏幕亮度
	 */
	protected void setBrightness() {

		WindowManager.LayoutParams lp = ((MainActivity) object).getWindow().getAttributes();
		int brightness = Settings.System.getInt(((MainActivity) object).getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0);
		// if(brightness <217)
		// lp.screenBrightness = 0.85f;
		// else
		// brightness += 10;
		// if(brightness > 255)
		// brightness = 60;

		lp.screenBrightness = brightness / 255.0f;
		((MainActivity) object).getWindow().setAttributes(lp);

		Settings.System.putInt(((MainActivity) object).getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, brightness);
	}

}
</span>
后面增加新的需求,如果进度条跑到10.20.30.40.50.60.70.80,90.100,会发出提示声音。如果进度条跑到20.40.60.80.100,会点亮屏幕,解锁。其实在updateReceiver中的
<span style="font-size:12px;">if(progress % 10 == 0){
            	SoundManager.getInstance(context).playSound(SoundManager.NETERROR);
            }else{
            	SoundManager.getInstance(context).stopSound();
            }
            
            if(progress % 20 == 0){
            	lighten();
            }else {
            	
            }</span>
应该放在服务中更好,我比较懒,在demo中就没改了,好了,暂时就这么多了,等下一版本吧。下载地址:http://download.csdn.net/detail/u012301841/8250881

服务与控制界面(Activity)的交互---仿qq后台服务(一)