zoukankan      html  css  js  c++  java
  • Android菜鸟的成长笔记(16)——Service简介

    Service是Android四大组件之一

    1、Service与Activity的区别在:Service一直在后台运行,没有用户界面。

    2、选择Activity与Service的标准:如果某个程序组件需要在运行时向用户呈现某种界面,或者改程序需要和用户进行交互,就需要用Activity,否则需要考虑使用Service.

    3、Android系统本身提供了大量的Service组件,开发者可以通过Service来操作Android系统。

    4、Service组件有自己的生命周期。

    5、Service与Activity都是从Context派生而来的,都可以调用Context里面定义的如getResources()、getContentResolver()等方法。

    下面我们来先创建一个Service并启动

    (1)定义一个继承Service的子类。

    package com.example.testservice;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    public class FirstService extends Service{
    
    	@Override
    	public IBinder onBind(Intent arg0) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    	
    	@Override
    	public void onCreate() {
    		// TODO Auto-generated method stub
    		super.onCreate();
    		System.out.println("onCreate");
    	}
    	
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		// TODO Auto-generated method stub
    		System.out.println("onStartCommand");
    		return super.onStartCommand(intent, flags, startId);
    		
    	}
    	
    	@Override
    	public void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		System.out.println("onDestroy");
    	}
    
    }
      注意:上面的onBind()方法是必须实现的方法。
    (2)在AndroidMainfest.xml文件中配置该Service

    <service android:name=".FirstService">
                <intent-filter >
                    <action android:name="com.meritit.service.FIRST_SERVICE"/>
                </intent-filter>
     </service>
    如果希望Service组件做某些事情,只要在onCreate()onStartCommand()方法中定义相关业务代码即可。

    (3)运行Service

    运行Service的方法有两种:

    a: 通过Context的startService()方法:通过该方法启动Service,访问者与Service之间没有关联,即使访问者退出了,Service任然运行。

    b:通过Context的bindService()方法:使用该方法启动Service,访问者与Service绑定在了一起,访问者一旦退出,Service也就终止了。

    下面先通过第一种方式运行Service

    package com.example.testservice;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    	private Button start;
    	private Button stop;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		//获取程序界面中的start、stop两个按钮
    		start = (Button) findViewById(R.id.start);
    		stop = (Button) findViewById(R.id.stop);
    		
    		final Intent intent = new Intent();
    		intent.setAction("com.meritit.service.FIRST_SERVICE");
    		
    		start.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View arg0) {
    				startService(intent);
    			}
    		});
    		
    		stop.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				stopService(intent);
    			}
    		});
    	}
    }
    从上面代码中可以看出,启动、关闭Service非常容易,只需要调用Context里面定义的startService()方法和stopService()方法。

    连续单击“启动Service"按钮,程序将会连续多次启动Service,LogCat如图:


    从图中我们可以看出,onCreate方法只被调用了一次,这说明:每次Service被第一次启动调用onCreate()方法,多次启动已经启动的Service组件将不会再回调onCreate()方法啊,但每次启动时都会回调onStartCommand()方法,这样就可以根据不同的业务需求将业务代码放在onCreate()方法或onStartCommand()方法中。下图是Service的生命周期,因为比较简单所以就不叙述过程了。



    下一篇将介绍:绑定本地Service并与之通信


  • 相关阅读:
    PHP面试题遇到的几个坑。...面壁ing
    Java基础- super 和 this 解析
    openStack use
    ceph伦理概念
    openstack core components use 总结
    current imporant Posts
    openNebula rgister img instance vms error collections
    openStack images概念及维护
    Error copying image in the datastore: Not allowed to copy image file
    OpenNebula openldap集成
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469470.html
Copyright © 2011-2022 走看看