Android本地服务
一、服务生命周期总结
(一)、单独开启服务,并没有绑定服务
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本地服务的更多相关文章
- Android Service学习之本地服务
Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...
- LoadRunner+Android模所器实现抓包并调试本地服务端
步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3: 选择下一步后, ...
- Android:关于服务的总结
服务 startService(intent) stopService(intent) 服务的生命周期 如果采用start的方式开启服务 oncreate()--->onstartcommand ...
- Anroid四大组件service之本地服务
服务是Android四大组件之一,与Activity一样,代表可执行程序.但Service不像Activity有可操作的用户界面,它是一直在后台运行.用通俗易懂点的话来说: 如果某个应用要在运行时向用 ...
- android的服务分类-andrioid学习之旅(94)
摘自韩国棒子的书,android框架摘要 android服务类型分类,如下图: 对于本地服务,有两种类型,一中是绑定进行数据交流,一种是不绑定的,生命周期如下图:
- Android 本地tomcat服务器接收处理手机上传的数据之案例演示
上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建 本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程 场景:A ...
- Android-bindService本地服务-音乐播放(后台播放)-下
在上一篇 Android-bindService本地服务-音乐播放-上,博客中是不能在后台中播放到,这次博客增加了一个后台播放 通常情况下,Activity切换到后台,Service提升到前台进程, ...
- Android-bindService本地服务-初步-Service返回对象
在Android开发过程中,Android API 已经有了startService方式,为什么还需要bindService呢? 答:是因为bindService可以实现Activity-->S ...
- Android-bindService本地服务-初步
在Android开发过程中,Android API 已经有了startService方式,为什么还需要bindService呢? 答:是因为bindService可以实现Activity-->S ...
随机推荐
- Cassandra 的压缩策略STCS,LCS 和 DTCS
更新说明: 本文编写时最新的Cassandra版本为2.2,最新的稳定版本为2.1.8 2016年6月23日,增加一篇译文,当下最新版本为3.7 最新的Cassandra 2.1 或者更高的版本支持3 ...
- Hive中的排序语法
ORDER BY hive中的ORDER BY语句和关系数据库中的sql语法相似.他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间. ...
- Java输出1~1000之间所有可以被3整除又可以被5整除的数
主要在于判断是否能被整除,思路是用取余运算符%,取余结果为0就表示能被整除. 代码如下: public class NumDemo { public static void main(String a ...
- VMware虚拟机升级过程中遇到的一点问题
在将VWware由9.0升级到10.0的过程中,出现如下图的错误: failed to create the requested registry key Key:Installer e ...
- Storm入门学习随记
推荐慕课网视频:http://www.imooc.com/video/10055 ====Storm的起源. Storm是开源的.分布式.流式计算系统 什么是分布式呢?就是将一个任务拆解给多个计算机去 ...
- android ptl
Gerrit android update sdk --no-uiadb logcat MyActivity:* *:S Connecting adb over Wi-Fiadb tcpip 5555 ...
- 仿SDWebImage
仿SDWebImage 目标:模拟 SDWebImage 的实现 说明:整体代码与之前博客上的演练代码的基本一致,只是编写顺序会有变化! 在模仿 SDWebImage 之前,首先需要补充一个知识点:N ...
- jquery一个控件绑定多个事件
jQuery("#id").bind("click mouseover",function(){}) // 两个事件中间有空格 $("p" ...
- 一个.net程序员教你使用less
我是一个.net 程序员,虽然说一直做后台,但是web 前端也会去学,虽然说技术只是层窗户纸,但是像我这种多动症患者,不捅破我心难受啊! 好!废话不多提,下面直接正题,至于less 是什么这里不多讲因 ...
- mysql字段累加concat
update tablename set field1=concat(field1,'_bak') where field2 like '%@xxx’