• Android中的Service组件具体解释


    Service与Activity的差别在于:Service一直在后台执行,他没实用户界面,绝不会到前台来。

    一,创建和配置Service

    开发Service须要两个步骤:1。继承Service子类,2。在Manifest.xml文件里配置Service

    Service中的方法:

    public class FirstService extends Service
    {
    	// 必须实现的方法。返回一个IBinder对象,应用程序可通过该对象与Service组件通信
    	@Override
    	public IBinder onBind(Intent arg0)
    	{
    		return null;
    	}
    	// Service被创建时回调该方法。
    	@Override
    	public void onCreate()
    	{
    		super.onCreate();
    		System.out.println("Service is Created");
    	}
    	// Service被启动时回调该方法
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId)
    	{
    		System.out.println("Service is Started");
    		return START_STICKY;
    	}
    	// Service被关闭之前回调。
    	@Override
    	public void onDestroy()
    	{
    		super.onDestroy();
    		System.out.println("Service is Destroyed");
    	}
    }
    Manifest.xml中配置service

    <!-- 配置一个Service组件 -->
    		<service android:name=".FirstService">
    			<intent-filter>
    				<!-- 为该Service组件的intent-filter配置action -->
    				<action android:name="org.service.FIRST_SERVICE" />
    			</intent-filter>
    		</service>


    二,启动和停止Service

    1,startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信。訪问者与Service没有关联。即使訪问者退出了。Service仍然执行。停止服务使用stopService
    bindService 启动的服务:该方法启动的服务要进行通信。停止服务使用unbindService

    public class StartServiceTest extends Activity
    {
    	Button start, stop;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		// 获取程序界面中的start、stop两个button
    		start = (Button) findViewById(R.id.start);
    		stop = (Button) findViewById(R.id.stop);
    		// 创建启动Service的Intent
    		final Intent intent = new Intent();
    		// 为Intent设置Action属性
    		intent.setAction("org.service.FIRST_SERVICE");
    		start.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0)
    			{
    				// 启动指定Serivce
    				startService(intent);
    			}
    		});
    		stop.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View arg0)
    			{
    				// 停止指定Serivce
    				stopService(intent);
    			}
    		});
    	}
    2,绑定本地Service并与之通信

    假设訪问者和Service之间须要进行方法调用或者数据传递,则应该使用bindService和unbindService方法启动关闭Service

    boolean bindService(Intent service, ServiceConnection conn,int flags)方法:

    service:这个參数通过Intent指定要启动的Service

    conn:ServiceConnection 对象。该对象用于监听訪问者与Service之间的连接情况。

    当訪问者与Service之间连接成功时将会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service);当Service所在的宿主中止。导致Service与訪问者之间断开时会回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法

    flags:绑定时是否自己主动创建Service。0或BIND_AUTO_CREATE


    ServiceConnection对象的onServiceConnected方法中有一个IBinder对象。该对象就可以与被绑定Service之间的通信

      

    通信原理:当开发Service是。

    该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象会传给ServiceConnection对象的onServiceConnected的(ComponentName name, IBinder service)的service參数。这样訪问者就可使用该IBinder对象与Service进行通信了


    BindService.java

    public class BindService extends Service//继承Service
    {
    	private int count;
    	private boolean quit;
    	// 定义onBinder方法所返回的对象。此binder会传给訪问者
    	private MyBinder binder = new MyBinder();
    	// 通过继承Binder来实现IBinder类
    	public class MyBinder extends Binder //①
    	{
    		public int getCount()
    		{
    			// 获取Service的执行状态:count
    			return count;
    		}
    	}
    	// 必须实现的方法。绑定该Service时回调该方法
    	@Override
    	public IBinder onBind(Intent intent)
    	{
    		System.out.println("Service is Binded");
    		// 返回IBinder对象
    		return binder;
    	}
    	// Service被创建时回调该方法。

    @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); // 启动一条线程、动态地改动count状态值 new Thread() { @Override public void run() { while (!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { } count++; } } }.start(); } // Service被断开连接时回调该方法 @Override public boolean onUnbind(Intent intent) { System.out.println("Service is Unbinded"); return true; } // Service被关闭之前回调该方法。 @Override public void onDestroy() { super.onDestroy(); this.quit = true; System.out.println("Service is Destroyed"); } }

    配置Service组件:

    <!-- 配置一个Service组件 -->
    		<service android:name=".BindService">
    			<intent-filter>
    				<!-- 为该Service组件的intent-filter配置action -->
    				<action android:name="org.crazyit.service.BIND_SERVICE" />
    			</intent-filter>	
    		</service>

    BindServiceTest.java

    public class BindServiceTest extends Activity
    {
    	Button bind, unbind, getServiceStatus;
    	// 保持所启动的Service的IBinder对象
    	BindService.MyBinder binder;
    	// 定义一个ServiceConnection对象
    	private ServiceConnection conn = new ServiceConnection()
    	{
    		// 当该Activity与Service连接成功时回调该方法
    		@Override
    		public void onServiceConnected(ComponentName name
    			, IBinder service)
    		{
    			System.out.println("--Service Connected--");
    			// 获取Service的onBind方法所返回的MyBinder对象
    			binder = (BindService.MyBinder) service; //①
    		}
    
    		// 当该Activity与Service断开连接时回调该方法
    		@Override
    		public void onServiceDisconnected(ComponentName name)
    		{
    			System.out.println("--Service Disconnected--");
    		}
    	};
    
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		// 获取程序界面中的start、stop、getServiceStatusbutton
    		bind = (Button) findViewById(R.id.bind);
    		unbind = (Button) findViewById(R.id.unbind);
    		getServiceStatus = (Button) findViewById(R.id.getServiceStatus);
    		// 创建启动Service的Intent
    		final Intent intent = new Intent();
    		// 为Intent设置Action属性
    		intent.setAction("org.crazyit.service.BIND_SERVICE");
    		bind.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View source)
    			{
    				// 绑定指定Serivce
    				bindService(intent, conn, Service.BIND_AUTO_CREATE);
    			}
    		});
    		unbind.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View source)
    			{
    				// 解除绑定Serivce
    				unbindService(conn);
    			}
    		});
    		getServiceStatus.setOnClickListener(new OnClickListener()
    		{
    			@Override
    			public void onClick(View source)
    			{
    				// 获取、并显示Service的count值
    				Toast.makeText(BindServiceTest.this,
    					"Serivce的count值为:" + binder.getCount(),
    					Toast.LENGTH_SHORT).show(); //②
    			}
    		});
    	}
    }

  • 相关阅读:
    第一次用NUnitAsp
    IT能够解决所有的商业问题吗?
    在这种东西里面,你会自在吗?
    看了段.net show之后的感想
    获取当前数据库中所有表的记录数
    对瀑布模型各阶段的解释
    Linux内核中的slab/slob/slub 在搞晕前先记下来
    分布式事务AT、TCC、Saga、XA 模式分析对比
    读懂Windows的“虚拟内存”为你量身定制
    示范NTFS 卷上的硬链接
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7260371.html
Copyright © 2020-2023  润新知