Service学习

什么是Service
有些用时比较长的操作我们希望他在后台运行,不耽误我们当前的操作。这就引入了Service的概念。常见的比如:访问网络,文件IO操作,大数据的数据库任务,播放音乐等。
Service在后台运行,并不用户进行交互。在默认的情况下,Service运行在应用程序进程的主线程中,如果要在Service中处理一些网络连接等耗时的操作,那么应当将这些任务放到单独的线程中处理,避免阻塞用户界面
What is a service?
API解释:
Most confusion about the Service class actually revolves around what it is not:
A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.
A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
启动服务,不用多线程,界面是否会阻塞 Yes
启动服务后,按Home键,服务是否还在运行 Yes
启动服务后,退出进程,是否服务还会运行 No
public class ServiceTest extends Activity{
	Intent service;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.service);
		
		Button startService=(Button)findViewById(R.id.start);
		startService.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				service=new Intent(ServiceTest.this, MyService.class);
				startService(service);
			}
		});
		Button stopService=(Button)findViewById(R.id.stop);
		stopService.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(service!=null){
					boolean returnResult=stopService(service);
					Log.d("MyLog", "MyService has stoped "+returnResult);
				}
			}
		});
	}
}
public class MyService extends Service{

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		//证明是主线程
		/*for (int i = 0; i < 100; i++) {
			try{
				Thread.sleep(1000);
				Log.d("MyLog", "Starting BeginService "+i);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}*/
		
		//采用多线程
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = 0; i < 100; i++) {
					try {
						Thread.sleep(1000);
						Log.d("MyLog", "Starting BeginService "+i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}).start();
		
		
		
		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onDestroy() {
		Log.d("MyLog", "MyService OnDestory");
		super.onDestroy();
	}

}
//证明是主线程
for (int i = 0; i < 100; i++) {
   try{
	 Thread.sleep(1000);			
    }catch(InterruptedException e){
	  e.printStackTrace();
    }
}
08-28 15:24:35.100: DEBUG/MyLog(493): Starting BeginService 0
08-28 15:24:36.142: DEBUG/MyLog(493): Starting BeginService 1
08-28 15:24:37.163: DEBUG/MyLog(493): Starting BeginService 2
08-28 15:24:38.166: DEBUG/MyLog(493): Starting BeginService 3
08-28 15:24:39.165: DEBUG/MyLog(493): Starting BeginService 4
08-28 15:24:40.167: DEBUG/MyLog(493): Starting BeginService 5
08-28 15:24:41.164: DEBUG/MyLog(493): Starting BeginService 6
08-28 15:24:42.175: DEBUG/MyLog(493): Starting BeginService 7
08-28 15:24:43.175: DEBUG/MyLog(493): Starting BeginService 8
08-28 15:24:44.242: DEBUG/MyLog(493): Starting BeginService 9
08-28 15:24:45.244: DEBUG/MyLog(493): Starting BeginService 10
当按home键的时候程序正常执行,但是当按back键的时候出现ANR错误:
08-28 07:00:09.114: ERROR/ActivityManager(58): ANR in com.gao
08-28 07:00:09.114: ERROR/ActivityManager(58): Reason: Executing service com.gao/.service.MyService
08-28 07:00:09.114: ERROR/ActivityManager(58): Load: 0.61 / 0.51 / 0.33
08-28 07:00:09.114: ERROR/ActivityManager(58): CPU usage from 182882ms to 55ms ago:
08-28 07:00:09.114: ERROR/ActivityManager(58):   system_server: 10% = 7% user + 2% kernel / faults: 3353 minor 6 major
08-28 07:00:09.114: ERROR/ActivityManager(58):   adbd: 0% = 0% user + 0% kernel / faults: 55 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   ndroid.launcher: 0% = 0% user + 0% kernel / faults: 775 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   qemud: 0% = 0% user + 0% kernel / faults: 2 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   d.process.acore: 0% = 0% user + 0% kernel / faults: 1124 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   id.defcontainer: 0% = 0% user + 0% kernel / faults: 135 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   com.svox.pico: 0% = 0% user + 0% kernel / faults: 89 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   logcat: 0% = 0% user + 0% kernel / faults: 3 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   events/0: 0% = 0% user + 0% kernel
08-28 07:00:09.114: ERROR/ActivityManager(58):   zygote: 0% = 0% user + 0% kernel / faults: 94 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   ndroid.settings: 0% = 0% user + 0% kernel / faults: 92 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   m.android.phone: 0% = 0% user + 0% kernel / faults: 67 minor 1 major
08-28 07:00:09.114: ERROR/ActivityManager(58):   com.android.mms: 0% = 0% user + 0% kernel / faults: 43 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   m.android.email: 0% = 0% user + 0% kernel / faults: 43 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   .quicksearchbox: 0% = 0% user + 0% kernel / faults: 42 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   d.process.media: 0% = 0% user + 0% kernel / faults: 44 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   roid.alarmclock: 0% = 0% user + 0% kernel / faults: 41 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   android.protips: 0% = 0% user + 0% kernel / faults: 41 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   zygote: 0% = 0% user + 0% kernel / faults: 53 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   pdflush: 0% = 0% user + 0% kernel
08-28 07:00:09.114: ERROR/ActivityManager(58):   installd: 0% = 0% user + 0% kernel / faults: 3 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):   m.android.music: 0% = 0% user + 0% kernel / faults: 41 minor
08-28 07:00:09.114: ERROR/ActivityManager(58):  +com.gao: 0% = 0% user + 0% kernel
08-28 07:00:09.114: ERROR/ActivityManager(58):  -com.gao: 0% = 0% user + 0% kernel
08-28 07:00:09.114: ERROR/ActivityManager(58): TOTAL: 18% = 11% user + 6% kernel + 0% irq + 0% softirq
08-28 07:00:09.274: DEBUG/dalvikvm(58): GC_FOR_MALLOC freed 3354 objects / 253392 bytes in 119ms
08-28 07:00:09.274: INFO/dalvikvm-heap(58): Grow heap (frag case) to 5.096MB for 82056-byte allocation
08-28 07:00:09.474: DEBUG/dalvikvm(58): GC_FOR_MALLOC freed 295 objects / 14200 bytes in 190ms
08-28 07:00:09.675: DEBUG/dalvikvm(58): GC_FOR_MALLOC freed 72 objects / 228600 bytes in 194ms
08-28 07:00:14.190: WARN/ActivityManager(58): Launch timeout has expired, giving up wake lock!
08-28 07:00:14.280: WARN/ActivityManager(58): Activity idle timeout for HistoryRecord{43f20808 com.gao/.service.ServiceTest}
这也就证明了service是在主线程里面执行的,而在service里面新建一个线程就可以正常的执行。
当单击StopService按钮时,在主线程里面的会出现按钮不可点击,出现ANR错误。当以一个线程启动的时候,可以正常停止服务,但是已经启动的线程还是继续在运行。
08-28 16:13:37.265: DEBUG/MyLog(781): Starting BeginService 0
08-28 16:13:38.279: DEBUG/MyLog(781): Starting BeginService 1
08-28 16:13:39.328: DEBUG/MyLog(781): Starting BeginService 2
08-28 16:13:40.375: DEBUG/MyLog(781): Starting BeginService 3
08-28 16:13:41.437: DEBUG/MyLog(781): Starting BeginService 4
08-28 16:13:42.184: DEBUG/MyLog(781): MyService has stoped true
08-28 16:13:42.184: DEBUG/MyLog(781): MyService OnDestory
08-28 16:13:42.503: DEBUG/MyLog(781): Starting BeginService 5
08-28 16:13:43.560: DEBUG/MyLog(781): Starting BeginService 6
08-28 16:13:44.566: DEBUG/MyLog(781): Starting BeginService 7
08-28 16:13:45.582: DEBUG/MyLog(781): Starting BeginService 8


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值