zoukankan      html  css  js  c++  java
  • Android 四大组件学习之Service五

    本节学习IntentService, 可能就有人问了。 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentService呢?

    带着这两个问题,我们先来看一个样例:

    我们新建一个MyIntentService样例:

    public class MyIntentService extends IntentService {
    
    	private int count = 5;
    	public MyIntentService() {
    		super("MyIntentService");
    		// TODO Auto-generated constructor stub
    	}
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		Log.i("MyIntentService", "onBind------------");
    		return super.onBind(intent);
    	}
    
    	@Override
    	public void onCreate() {
    		// TODO Auto-generated method stub
    		Log.i("MyIntentService", "onCreate------------");
    		super.onCreate();
    	}
    
    	@Override
    	public void onDestroy() {
    		// TODO Auto-generated method stub
    		Log.i("MyIntentService", "onDestroy------------");
    		super.onDestroy();
    	}
    
    	@Override
    	public void onStart(Intent intent, int startId) {
    		// TODO Auto-generated method stub
    		Log.i("MyIntentService", "onStart------------");
    		super.onStart(intent, startId);
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		// TODO Auto-generated method stub
    		Log.i("MyIntentService", "onStartCommand------------");
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	protected void onHandleIntent(Intent arg0) {
    		// TODO Auto-generated method stub
    		
    		while(count > 0)
    		{
    			//设置时间的输出方式
    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    			String  time = format.format(new Date());
    			
    			//显示时间
    			Log.i("MyService", time);
    			
    			try {
    				//延迟一秒
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			count--;
    		}
    	}
    
    }
    
    当中IntentService是Service的子类。须要继承与Service。

    在MyActivity中添加一个button。用于启动MyIntentService

    		btn_intent.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				// 启动服务
    				Intent intent = new Intent(MyActivity.this, MyIntentService.class);
    				Log.i("MyActivity", "启动Intent服务button被按下!");
    				startService(intent);
    			}
    		});

    执行效果例如以下:

    能够看到我们的界面没有出现卡住,(关于卡住不动。请看我Service二那节)。

    同一时候打印5次后,自己主动destory。

    既然现象已经看了,我总结一下:

    Service与IntentService之间的差别

    在这之前,须要知道Service的不足之处

    a: Service不是专门的一条新的线程。因此不应该在Service中处理相当耗时的任务

    b:service也不会专门的启动一个新的线程,Service与它所在的应用位于同一个进程中的。

    所以,对于Service的2个缺陷,就引入了IntentService。

    a:IntentService会使用一个队列来关联Intent的请求,每当Activity请求启动IntentService时,IntentService会将该请求增加一个队列。然后开启一个新的线程去处理请求。所以IntentService不会把主线程卡死

    b:IntentService会创建单独的线程处理onHandleIntent()方法里的实现代码

    c:同一时候IntentService不用重写onBind, OnStartCommand方法,仅仅需实现onHandleIntent()方法

    d:当所以的请求处理完后,Intent后自己主动停止服务,无需手动停止服务




  • 相关阅读:
    python笔记-列表和元组
    T-sql for xml path使用(转)
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
    VS2015 经常不出现智能提示,代码颜色也没有了
    虚拟机重新决定网卡地址时,老是报错
    模块的命令
    关闭NetworkManager的作用
    centos6上yum安装drbd(内核:2.6.32.696)
    检查硬件变化的命令kudzu
    parted分区和挂载及非交互式操作
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6891386.html
Copyright © 2011-2022 走看看