Android入门笔记之Service和Handler
来源:互联网 发布:网络加速foss 编辑:程序博客网 时间:2024/04/29 13:18
<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(){@Overridepublic 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() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub} }; listener=new OnClickListener() {@Overridepublic 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 ServicestopService(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] */@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean onUnbind(Intent arg0){Log.d("MyService", "=========onUnbind=========");return super.onUnbind(arg0);}@Overridepublic void onRebind(Intent arg0){super.onRebind(arg0);Log.d("MyService", "=========onRebind=========");}@Overridepublic void onCreate(){super.onCreate();Log.d("MyService", "=========onCreate=========");}@Overridepublic void onDestroy(){super.onDestroy();Log.d("MyService", "=========onDestroy=========");}}
- Android入门笔记之Service和Handler
- Android入门之Service和BroadcastReceiver
- Android笔记之handler
- Android之Handler笔记
- Android笔记之Service
- android学习笔记之Handler
- Android学习笔记之Handler
- Android入门笔记 - 界面开发 - ProgressBar,Handler
- Android入门开发之 Handler使用
- Android线程和Handler基础入门
- android学习笔记之Service
- Android学习笔记之Service
- Android之Service学习笔记
- Android 组件Service(二)之Handler、AsyncTask异步消息
- Web Service之Handler的验证和授权
- Android学习笔记之Handler(一)
- android学习笔记之handler(1)
- android学习笔记之handler(2)
- Android选项卡(TabWidget)例子
- python实现的一只从百度开始不断搜索的小爬虫
- new/delete和malloc/free的区别
- Web前台数据提交(不跳转页面)的两种方式
- cisco初步学习
- Android入门笔记之Service和Handler
- 图片的颜色处理
- VC连接SQLServer2005之 _RecordsetPtr的用法
- 有关native2ascii
- 补丁的制作与应用
- 安装MySQL5.5
- github
- Hadoop处理跨block行源码分析记录
- 设置MFC中EditBox为自动换行