一、Android 服务简介

Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。

Service的启动有两种方式:context.startService() 和 context.bindService()

二、原理和流程

1.创建前台服务,只需要提供一个通知栏图标并且调用startForeground即可。

2.想让服务做自己的想做的事情,也比较简单,只需要在onCreate或者onStartConmand的时候new一个Thread即可

3.如果Activity等UI想要和服务通信、调用服务提供的方法,怎么办呢?这时候就需要用到Binder了:只需要在onBind的时候返回一个IBinder对象,通过该对象可以获取当前Service的对象引用,这样就可以操作服务所提供的方法了,那如何在Service操作Acitivty呢?

有了Service引用,这个时候只需要在Service中给Activity开放设置回调接口即可。

4.当然了,服务需要在Manifest.xml中进行配置声明:

 <service android:name="com.czm.servicetest.MyService" >
</service>

三、实例:MyService.java

package com.czm.servicetest;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/**
* The Service Example
* @author caizhiming
*
*/
public class MyService extends Service{ IBinder mBinder = new MyBinder();
private int mCount = 0;
public boolean mIsStop = false; // get the instance of MyService
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
} public void setData(int data){
mCount = data;
}
public int getData(){
return mCount;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Thread thread = new Thread(null, new ServiceWorker(), "ServiceWorker");
thread.start();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.v("czm","onBind()-service is started");
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.v("czm","onStartCommand()-service is started");
return super.onStartCommand(intent, flags, startId);
}
//The Service work's thread
class ServiceWorker implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub
while(!mIsStop){
Log.v("czm","ServiceWorker: mCount="+mCount);
mCount ++;
if(mCount >= 10000){
mCount = 0;
}
if(mCount %5 == 0){
mListener.onCallback();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}
//The callback listener to operate UI such as Activity
private OnUICallbackListener mListener;
public void setListener(OnUICallbackListener listener){
mListener = listener;
}
public interface OnUICallbackListener{
void onCallback();
} }

四、如何使用服务-MyService?

package com.czm.servicetest;
import com.czm.servicetest.MyService.MyBinder;
import com.czm.servicetest.MyService.OnUICallbackListener; 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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity implements OnUICallbackListener{
private Button mBtnStart;
private Button mBtnChange;
private Button mBtnStop;
private TextView mTvResult; private MyService mMyService;
Intent serviceIntent; private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
mTvResult.setText(String.valueOf(mMyService.getData()));
mHandler.sendEmptyMessageDelayed(0, 1000);
};
}; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.v("czm","onServiceDisconnected()");
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.v("czm","onServiceConnected()");
MyBinder binder = (MyBinder) service;
mMyService = binder.getService();
mMyService.setListener(MainActivity.this);
mHandler.sendEmptyMessageDelayed(0, 0);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnStart = (Button)findViewById(R.id.btn_start);
mBtnChange = (Button)findViewById(R.id.btn_change);
mBtnStop = (Button)findViewById(R.id.btn_stop);
mTvResult = (TextView)findViewById(R.id.tv_result); mBtnStart.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//start service
serviceIntent = new Intent(MainActivity.this,MyService.class);
serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//bind service in order to communicate with service
MainActivity.this.bindService(serviceIntent, mServiceConnection, BIND_AUTO_CREATE);
// startService(serviceIntent);
}
});
mBtnChange.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mMyService.setData(1000);
}
});
mBtnStop.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mMyService.mIsStop = true;
MainActivity.this.unbindService(mServiceConnection);
stopService(serviceIntent);
}
});
} /**
* service callback
* @param serviceConnection
*/
@Override
public void onCallback() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "service callback", Toast.LENGTH_SHORT).show();
}
}); }
}

真题园网http://www.zhentiyuan.com

Android四大组件之服务-Service 原理和应用开发详解的更多相关文章

  1. Android四大组件之服务的两种启动方式详解

    Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...

  2. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  3. Android四大组件初识之Service

    Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...

  4. Android 四大组件之二(Service)

    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...

  5. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  6. Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

    转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/deta ...

  7. Android四大组件之服务

    创建一个服务,并与活动绑定 作为安卓四大组件之一的服务,毫无例外也要在manifast中进行注册 新建服务类继承于Service,并覆盖onBind( )方法,用于与活动绑定 public class ...

  8. Android四大组件之一:Service(服务)

    Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...

  9. Android 四大组件学习之Service六

    上几节.我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务.以及服务的生命周期,以及什么是IntentService. 也许有读者会发现,我们BindServer中 ...

随机推荐

  1. lightoj 1018 (状态压缩DP)

    设dp[s]表示状态s下所需要的线段的个数,s的二进制中第x位为1就表示该状态下第x个点没被线段覆盖.需要预处理出来在任意两点之间连线所覆盖点的状态O(n^3),然后记忆化搜索即可. #include ...

  2. iBatis之type

    iBatis下关于type的UML图,展示iBatis下关于类型的处理和注册等.

  3. js基础第3天

    仿淘宝搜索框案例(有价值) 判断用户输入事件 正常浏览器:oninput(判断用户输入) ie678浏览器兼容:onpropertychange(因为兼容性问题, ie浏览器678是需要使用这个来判断 ...

  4. 从IRP说起(转)

    原文链接:http://www.cnblogs.com/zhuyp1015/archive/2012/03/14/2396595.html IRP(I/O request package)是操作系统内 ...

  5. 企业移动互联网O2O微信支付流程图

    过去一周里最受关注的应该就是微信了,腾讯合作伙伴大会微信分论坛的火爆现场,没有亲临其境是无法想象的,近3000人报名,2000多人来到现场,试图进入只能容纳300人的会场…… 闲话不表,进入正题吧,本 ...

  6. POM详细配置

    POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/P ...

  7. JM编解码264

    看到有人说JM解码编码264 尝试了一下http://iphome.hhi.de/suehring/tml/download/win7下 vs2010 编译后,得到编码解码可执行文件ldecod.ex ...

  8. openstack python sdk list tenants get token get servers

    1,openstack python sdk 获取token 获取租户tenants projects #!/bin/bash export OS_PROJECT_DOMAIN_ID=default ...

  9. inter

    网卡不稳定的罪魁祸首   近期新上的DB SERVER服务器,在压测中发现网卡很不稳定,压力测试刚刚进行十几分钟后,服务器反应就变得非常慢,PING的时候经常丢包而且SSH连接也时断时 续.刚开始以为 ...

  10. Intent简介

    1 Intent概念 1.1 Intent的作用 指明Intent所要启动的对象 提供将要启动对象组件运行需要的数据 组件类型 启动方法 Activity startActivity(Intent i ...