Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

来源:互联网 发布:淘宝卖耐克 编辑:程序博客网 时间:2024/06/05 15:15

前面已经写过关于startService(Unbounded Service)的一篇文章:《Android菜鸟的成长笔记(16)——Service简介》本篇将在这一篇的基础上再来看一下startService的用法。先看一段代码:

TestService.java

  1. package com.example.myfirstapp;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7.   
  8. public class TestService extends Service{  
  9.   
  10.     private static final String TAG = "大碗干拌";  
  11.   
  12.     @Override  
  13.     public IBinder onBind(Intent arg0) {  
  14.         // TODO Auto-generated method stub  
  15.         return null;  
  16.     }  
  17.       
  18.     @Override  
  19.     public void onCreate() {  
  20.         // TODO Auto-generated method stub  
  21.         super.onCreate();  
  22.         task();  
  23.     }  
  24.       
  25.     @Override  
  26.     public int onStartCommand(Intent intent, int flags, int startId) {  
  27.         // TODO Auto-generated method stub  
  28.         return super.onStartCommand(intent, flags, startId);  
  29.     }  
  30.       
  31.     public void task(){  
  32.         int i=0;  
  33.         while(true){  
  34.             Log.i(TAG, "" + i);  
  35.             try {  
  36.                 Thread.sleep(1000);  
  37.             } catch (InterruptedException e) {  
  38.                 // TODO Auto-generated catch block  
  39.                 e.printStackTrace();  
  40.             }  
  41.         }  
  42.     }  
  43.   
  44. }  
MainActivity.java

  1. Button loginButton = (Button) findViewById(R.id.main_login_button);  
  2. loginButton.setOnClickListener(new OnClickListener() {  
  3.       
  4.     @Override  
  5.     public void onClick(View arg0) {  
  6.         intent = new Intent(MainActivity.this, TestService.class);  
  7.         startService(intent);  
  8.     }  
  9. });  
  10.   
  11. ImageView iv = (ImageView) findViewById(R.id.main_view_iv);  
  12. iv.setOnClickListener(new OnClickListener() {  
  13.       
  14.     @Override  
  15.     public void onClick(View arg0) {  
  16.         stopService(intent);  
  17.     }  
  18. });  
运行结果:

会看到控制台会不断的打印,但是屏幕会失去焦点,不能操作,等十几秒后出现ANR异常。

我们再看看DDMS中进程和线程


可以看到即没有新的进程,也没有新的线程。

这充分说明Service即不是一个进程也不是一个 线程,而是一个绑定在进程中的服务,我们如果要在Service中处理延时操作应该放在线程中。
现在我们将输出Log的代码放入线程,启动Service后在MainActivity中用stopService来停止Service.

  1. public class TestService extends Service{  
  2.   
  3.     private static final String TAG = "大碗干拌";  
  4.   
  5.     @Override  
  6.     public IBinder onBind(Intent arg0) {  
  7.         // TODO Auto-generated method stub  
  8.         return null;  
  9.     }  
  10.       
  11.     @Override  
  12.     public void onCreate() {  
  13.         // TODO Auto-generated method stub  
  14.         super.onCreate();  
  15.         task();  
  16.     }  
  17.       
  18.     @Override  
  19.     public int onStartCommand(Intent intent, int flags, int startId) {  
  20.         // TODO Auto-generated method stub  
  21.         return super.onStartCommand(intent, flags, startId);  
  22.     }  
  23.       
  24.     public void task(){  
  25.         new Thread(){  
  26.             public void run() {  
  27.                 int i=0;  
  28.                 while(true){  
  29.                     Log.i(TAG, "" + i);  
  30.                     try {  
  31.                         Thread.sleep(1000);  
  32.                     } catch (InterruptedException e) {  
  33.                         // TODO Auto-generated catch block  
  34.                         e.printStackTrace();  
  35.                     }  
  36.                     i++;  
  37.                 }  
  38.             };  
  39.         }.start();  
  40.     }  
  41.       
  42.     @Override  
  43.     public void onDestroy() {  
  44.         Log.i(TAG, "Service onDestory");  
  45.         super.onDestroy();  
  46.     }  
  47.   
  48. }  
运行结果:

会发现已经调用了Service的onDestory方法,为什么还在打印Log?其实Service此时却是确实已经destroy了,但是我们启动的线程还存在,所以继续打印。

其实Service还有一个停止的方法stopSelf()

  1. public void task(){  
  2.     new Thread(){  
  3.         public void run() {  
  4.             int i=0;  
  5.             while(true){  
  6.                 Log.i(TAG, "" + i);  
  7.                 try {  
  8.                     Thread.sleep(1000);  
  9.                 } catch (InterruptedException e) {  
  10.                     // TODO Auto-generated catch block  
  11.                     e.printStackTrace();  
  12.                 }  
  13.                 i++;  
  14.                 if(i == 10){  
  15.                     stopSelf(1);  
  16.                 }  
  17.             }  
  18.         };  
  19.     }.start();  
  20. }  


0 0
原创粉丝点击