Android入门笔记之Service和Handler

本文详细阐述了Android中的Service和Handler机制,包括它们的类型、生命周期、使用方法及常见问题解决策略。通过ServiceActivity和myService的实例代码,展示了如何在Android应用中实现服务的启动、绑定、解绑及消息的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<1>简介

Service和Handler是android重要的机制之一。

<2>关键步骤

服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

那么先来看Service的生命周期吧:如图:

 

context.startService()->onCreate()->onStart()->Service running--调用context.stopService()->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind()-> onDestroy()从上可以知道分别对应本地的以及远程的,也对应不同的方式启动这个服务。

 

 

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

发送、接受、处理消息–消息队列;

启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

post()  将一个线程加入线程队列;

sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

从消息队列中获取消息。

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

 

<3>出现的问题

       不要忘记注册service。

出现问题:

ActivityManager: Unable to start service Intent{ act=com.Android.MUSIC }: not found 

解决方法:

 1.检查AndroidManifest.xml配置文件中是否配置了service

 2.检查service 是否在application标签内

 3.如果你的service和启动的activity不在同一个包内,需要把service标签中的android:name配置成service类的完全名(最好直接android:name配置成service类的完全名)。

 

<4>代码及解释

       ServiceActivity.java:

package com.service;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.test.R;

public class ServiceActivity extends Activity{
	/**   
	 * @ProjectName:  [androidtest] 
	 * @Package:      [com.service.ServiceActivity.java]  
	 * @ClassName:    [ServiceActivity]   
	 * @Description:    
	 * @Author:       [gmj]   
	 * @CreateDate:   [2013-9-8 上午9:33:34]   
	 * @Version:      [v1.0] 
	 */
	ServiceConnection sc;
	OnClickListener listener;
	Handler hd = new Handler()
	{
		@Override	
		public void handleMessage(Message msg)
		{
			switch(msg.what)
			{
				case 0:
					Toast.makeText(
							ServiceActivity.this, 
							"调用Service的onCreate和onBind方法",
							Toast.LENGTH_SHORT).show();
				break;
				case 1:
					Toast.makeText(
							ServiceActivity.this, 
							"调用Service的onUnbind和onDistroy方法", 
							Toast.LENGTH_SHORT).show();
				break;
				case 2:
					Toast.makeText(
							ServiceActivity.this, 
							"调用Service的onDistroy方法", 
							Toast.LENGTH_SHORT).show();
				break;
				case 3:
					Toast.makeText(
							ServiceActivity.this, 
							"调用Service的onCreate方法",
							Toast.LENGTH_SHORT).show();
				break;
			}
		}
	};
	
	 public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.activity_service);
	        sc=new ServiceConnection()
	        {
				@Override
				public void onServiceConnected(ComponentName name, IBinder service) {
					// TODO Auto-generated method stub
					
				}

				@Override
				public void onServiceDisconnected(ComponentName name) {
					// TODO Auto-generated method stub
					
				}
	        };
	        
	        listener=new OnClickListener()
	        {
				@Override
				public void onClick(View v) {
					Intent intent=new Intent(ServiceActivity.this,myService.class);
					switch(v.getId())
					{
					  case R.id.serviceStart://Start Service
					    startService(intent);
					    hd.sendEmptyMessage(3);
					  break;
					  case R.id.serviceStop://Stop Service
						stopService(intent);
						hd.sendEmptyMessage(2);
				      break;
					  case R.id.serviceBind://Bind Service
					    bindService(intent,sc,BIND_AUTO_CREATE);
					    hd.sendEmptyMessage(0);
					  break;
					  case R.id.serviceUnBind://Unbind Service
					    unbindService(sc);
					    hd.sendEmptyMessage(1);
					  break;
					}
				}
	        };
	        
	        this.findViewById(R.id.serviceStart).setOnClickListener(listener);
	        this.findViewById(R.id.serviceStop).setOnClickListener(listener);
	        this.findViewById(R.id.serviceBind).setOnClickListener(listener);
	        this.findViewById(R.id.serviceUnBind).setOnClickListener(listener);
	    }
}

myService.java:

package com.service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class myService extends Service{

	/**   
	 * @ProjectName:  [androidtest] 
	 * @Package:      [com.service.myService.java]  
	 * @ClassName:    [myService]   
	 * @Description:    
	 * @Author:       [gmj]   
	 * @CreateDate:   [2013-9-8 上午9:29:22]   
	 * @Version:      [v1.0] 
	 */

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public boolean onUnbind(Intent arg0)
	{
		Log.d("MyService", "=========onUnbind=========");
		return super.onUnbind(arg0);
	}
	
	@Override
	public void onRebind(Intent arg0)
	{
		super.onRebind(arg0);		
		Log.d("MyService", "=========onRebind=========");		
	}	

	@Override
	public void onCreate()
	{
		super.onCreate();
		Log.d("MyService", "=========onCreate=========");	
	}
	
	@Override
	public void onDestroy()
	{
		super.onDestroy();
		Log.d("MyService", "=========onDestroy=========");	
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值