一、服务生命周期总结

(一)、单独开启服务,并没有绑定服务
Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onStart()
Activity中调用stopService(),服务的lifecycle:onDestroy()

(二)、单独绑定服务,并没有先开启服务
Activity中直接调用bindService(),服务的lifestyle:onCreate()→onBind()
Activity中调用unBindService(),服务的lifecycle:onUnbind()→onDestroy()

(三)、混合使用(先调用开启服务,再调用绑定服务)
1.startService(),服务的lifecycle:onCreate()→onStartCommand()→onStart()
2.bindService(),服务的lifestyle:onBind()
3.unBindService(),服务的lifecycle:onUnbind()
4.stopService(),服务的lifecycle:onDestroy()

(四)、混合使用(先绑定服务,再开启服务。一般不会这么做)
1.bindService(),服务的lifecycle:onCreate()→onBind()
2.startService(),服务的lifestyle:onStartCommand()→onStart()
3.unBindService(),服务的lifecycle:onUnbind()
4.stopService(),服务的lifecycle:onDestroy()

二、Activity与Service交互过程讲解

=============================================================

示例代码

一、布局Layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.shz.localservice.MainActivity"
tools:ignore="MergeRootFrame" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bindService"
android:text="绑定服务" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="unbindService"
android:text="解除绑定服务" /> <EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入电影票Id"
android:id="@+id/txtTicketId"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="callServiceMethod"
android:text="调用服务方法" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lblTicketInfo"
android:textColor="#ff0000"/> </LinearLayout>

二、主要代码

package com.shz.localservice;

import java.util.ArrayList;
import java.util.List; import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log; /**
* 后台服务(组件),提供查询电影票相关信息
* @author SHZ
*
*/
public class TicketService extends Service { private final static String TAG = "TicketService";
private List<Ticket> tickets; @Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind 服务绑定成功");
// 2.Activity绑定服务成功之后,服务返回给Activity一个IBinder类型的对象,
// 通过该对象,Activity就可以和服务进行交互了,就像一个代理一样
return new TicketBinder();
} @Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate 服务创建成功");
this.tickets = new ArrayList<Ticket>();
this.tickets.add(new Ticket(1, "变形金刚4", 103));
this.tickets.add(new Ticket(2, "窃听风云3", 86));
this.tickets.add(new Ticket(3, "反腐风暴", 75));
} @Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "onStart 服务启动");
super.onStart(intent, startId);
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand 服务启动");
return super.onStartCommand(intent, flags, startId);
} @Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "onUnbind 服务解绑成功");
return super.onUnbind(intent);
} @Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy 服务销毁成功");
} private Ticket getTicket(int id)
{
for(Ticket ticket:this.tickets)
{
if(ticket.Id == id)
{
return ticket;
}
} return null;
} /**
* 服务内部方法:查询电影票信息
* @param id
* @return
*/
public String getTicketInfo(int id)
{
Ticket ticket = this.getTicket(id);
if(ticket == null)
{
return "未查询到该电影票信息";
}
else
{
return ticket.toString();
}
} /**
* 服务内部方法(测试用,没有意义):更新电影票价格
* @param id
* @param newPrice
*/
public void updateTicketPrice(int id, float newPrice)
{
Ticket ticket = this.getTicket(id);
if(ticket != null)
{
ticket.Price = newPrice;
}
} /**
* 自定义一个代理类,继承Binder并实现IService接口。
* 服务会返回该类的一个实例给调用者,调用者可通过该实例调用相应的类方法
* @author SHZ
*
*/
private class TicketBinder extends Binder implements IService
{
/**
* 实现IService接口中的方法,调用服务内部的方法,这样调用服务的Activity就可以获取电影票信息了
*/
@Override
public String getTicketInfoById(int id) {
return getTicketInfo(id);
} /**
* 由于该方法并未在IService接口中定义,故调用者无法使用该方法
* @param id
* @param newPrice
*/
public void updateTicketPrice(int id,float newPrice)
{
updateTicketPrice(id, newPrice);
} } }
package com.shz.localservice;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build; public class MainActivity extends Activity { private TicketServiceConnection conn;
private IService ticketBinder;
private EditText txtTicketId;
private TextView lblTicketInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); txtTicketId = (EditText) findViewById(R.id.txtTicketId);
lblTicketInfo = (TextView) findViewById(R.id.lblTicketInfo);
} private class TicketServiceConnection implements ServiceConnection
{ @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 3.绑定服务成功之后,后台服务会返回IBinder类型的 service 对象,通过该对象可以间接调用后台服务的方法
ticketBinder = (IService) service;
} @Override
public void onServiceDisconnected(ComponentName name) { } } /**
* 开始服务
* @param view
*/
public void startService(View view)
{
Intent service = new Intent(this,TicketService.class);
startService(service);
} /**
* 绑定服务
* @param view
*/
public void bindService(View view) {
Intent service = new Intent(this,TicketService.class);
// 1.绑定服务
// service:服务意图
// new TicketServiceConnection():与后台服务连接的对象,接收后台服务信息
// BIND_AUTO_CREATE:如果服务没有被创建,则自动创建并绑定
conn = new TicketServiceConnection();
bindService(service, conn, BIND_AUTO_CREATE);
} /**
* 解除绑定服务
* @param view
*/
public void unbindService(View view) {
unbindService(conn);
} /**
* 停止服务
* @param view
*/
public void stopService(View view)
{
Intent service = new Intent(this,TicketService.class);
stopService(service);
} @Override
protected void onDestroy() {
try {
unbindService(conn);
} catch (Exception e) {
}
super.onDestroy();
} public void callServiceMethod(View view) {
if(this.ticketBinder == null)
{
Toast.makeText(this, "请先绑定服务", 1).show();
}
else
{
String strTicketId = this.txtTicketId.getText().toString().trim();
if(TextUtils.isEmpty(strTicketId))
{
Toast.makeText(this, "请输入电影票Id", 1).show();
return;
} // 4.调用IBinder对象的方法
String ticketInfo = this.ticketBinder.getTicketInfoById(Integer.parseInt(strTicketId));
this.lblTicketInfo.setText(ticketInfo);
}
} }
package com.shz.localservice;

public class Ticket {
public int Id;
public String Name;
public float Price; public Ticket(int id, String name, float price) {
Id = id;
Name = name;
Price = price;
} @Override
public String toString() {
return "您查询的电影是:"+this.Name+",票价为:"+this.Price;
}
}
package com.shz.localservice;

public interface IService {
public String getTicketInfoById(int id);
}

运行效果截图

Android本地服务的更多相关文章

  1. Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...

  2. LoadRunner+Android模所器实现抓包并调试本地服务端

    步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3:  选择下一步后, ...

  3. Android:关于服务的总结

    服务 startService(intent) stopService(intent) 服务的生命周期 如果采用start的方式开启服务 oncreate()--->onstartcommand ...

  4. Anroid四大组件service之本地服务

    服务是Android四大组件之一,与Activity一样,代表可执行程序.但Service不像Activity有可操作的用户界面,它是一直在后台运行.用通俗易懂点的话来说: 如果某个应用要在运行时向用 ...

  5. android的服务分类-andrioid学习之旅(94)

    摘自韩国棒子的书,android框架摘要 android服务类型分类,如下图: 对于本地服务,有两种类型,一中是绑定进行数据交流,一种是不绑定的,生命周期如下图:

  6. Android 本地tomcat服务器接收处理手机上传的数据之案例演示

    上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建     本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程   场景:A ...

  7. Android-bindService本地服务-音乐播放(后台播放)-下

    在上一篇  Android-bindService本地服务-音乐播放-上,博客中是不能在后台中播放到,这次博客增加了一个后台播放 通常情况下,Activity切换到后台,Service提升到前台进程, ...

  8. Android-bindService本地服务-初步-Service返回对象

    在Android开发过程中,Android API 已经有了startService方式,为什么还需要bindService呢? 答:是因为bindService可以实现Activity-->S ...

  9. Android-bindService本地服务-初步

    在Android开发过程中,Android API 已经有了startService方式,为什么还需要bindService呢? 答:是因为bindService可以实现Activity-->S ...

随机推荐

  1. Vue.js学习 Item4 -- 数据双向绑定

    Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue 模板因而从根本上不同于基于字符串的模板,请记住这点. ...

  2. JMeter2.13进行压力测试

    1.安装 2. 样本数目 总共发送到服务器的请求数. 最新样本 代表时间的数字,是服务器响应最后一个请求的时间 吞吐量 是服务器每分钟处理的请求数. 平均值 是总运行时间除以发送到服务器的请求数. 中 ...

  3. jquery源码学习--iceDog

    /** * @FileName : iceDog * @Author : PheonixHkbxoic * @Mail : hkbxoic@gmail.com * @DateTime : 2016-0 ...

  4. 随机获取Mysql数据表的一条或多条记录

    随机获得Mysql数据表的一条或多条记录有很多方法,下面我就以users(userId,userName,password......)表(有一百多万条记录)为例,对比讲解下几个方法效率问题: sel ...

  5. (转)Android SlidingTabLayout定制分割线和指示条颜色

    本文转载与:http://blog.csdn.net/zhangphil/article/details/48863347 Android SlidingTabLayout默认的滑动指示条是系统默认的 ...

  6. sendBroadcast 无法接收

    项目中遇到已经sendbroadcast,但是在对应的BroadcastReceiver中却无法调用onReceiver 真是个纠结的问题.找了许久. 终于发现Intent中传递了一个参数(自定义类继 ...

  7. jquery Mobile应用第2课《构建跨平台APP:jQuery Mobile移动应用实战》连载二(简单的QWER键盘)

    在jQuery Mobile的布局中,控件大多都是单独占据页面中的一行,按钮自然也不例外,但是仍然有一些方法能够让多个按钮组成一行,比如说在范例6-5中就利用按钮分组的方法使4个按钮并列在一行中,如图 ...

  8. 简答的理解C语言中的各种类型函数

    1.变参函数 变长参数的函数即参数个数可变.参数类型不定 的函数.最常见的例子是printf函数.scanf函数和高级语言的Format函数.在C/C++中,为了通知编译器函数的参数个数和类型可变(即 ...

  9. 生产库MySQL配置文件my.cnf详解

    OS:CentOS6.3 DB:5.6.16 [client] #客户端port = 3306 #数据库端口3306socket = /my/log/mysql.sock #MySQL套接字,多实例下 ...

  10. WARNING: /sys/kernel/mm/transparent_hugepage/enabled is

    安装MONGODB 3.0.6的时候提示警告信息,如下: 2015-09-09T11:04:35.011+0800 I CONTROL [initandlisten] ** WARNING: /sys ...