利用广播调用后台服务方法并根据方法返回的内容更新UI
一、UI布局代码
<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" > <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>
二、MainActivity代码
package com.shz.localservice; import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import com.shz.callservicebybroadcastreceiver.R; public class MainActivity extends Activity { /**
* 通过广播调用后台服务并更新UI 实现步骤:
* 1.前台Activity发出一个自定义广播A(Action:com.shz.getticketinfo),后台服务需注册该广播A进行监听。
* 2.后台服务监听到该广播A之后
* ,调用自己内部方法获取电影票信息,并发出一个自定义广播B(Action:com.shz.sendticketinfo)。
* 3.前台Activity需注册该广播B进行监听,获取广播B中的内容更新UI。
*/ private EditText txtTicketId;
private TextView lblTicketInfo;
private ReceiveTicketInfoReceiver receiver; @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); // 开启服务
Intent intent = new Intent(this, TicketService.class);
startService(intent); // 注册后台服务发出的广播,该广播包含电影票信息
receiver = new ReceiveTicketInfoReceiver();
IntentFilter filter = new IntentFilter("com.shz.sendticketinfo");
registerReceiver(receiver, filter);
} /**
* 该接收者用于监听后台服务发送出的广播B,并更新UI
*
* @author SHZ
*
*/
private class ReceiveTicketInfoReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String ticketInfo = intent.getStringExtra("TicketInfo");
lblTicketInfo.setText(ticketInfo);
} } public void callServiceMethod(View view) {
String strTicketId = this.txtTicketId.getText().toString().trim();
if(TextUtils.isEmpty(strTicketId))
{
Toast.makeText(this, "请输入电影票Id", 1).show();
return;
} // 发送一个自定义广播,后台服务会监听该广播,并调用服务方法获取电影票信息
Intent intent = new Intent();
intent.setAction("com.shz.getticketinfo");
intent.putExtra("TicketId", Integer.parseInt(strTicketId));
sendBroadcast(intent);
} @Override
protected void onDestroy() {
unregisterReceiver(receiver);
stopService(new Intent(this, TicketService.class));
super.onDestroy();
}
}
三、服务代码
package com.shz.localservice; import java.util.ArrayList;
import java.util.List; import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
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;
private SendTicketInfoReceiver receiver; @Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind 服务绑定成功");
return null;
} @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)); // 注册前台Activity发出的广播,该广播是请求电影票信息
receiver = new SendTicketInfoReceiver();
IntentFilter filter = new IntentFilter("com.shz.getticketinfo");
registerReceiver(receiver, filter);
} @Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy 服务销毁成功");
unregisterReceiver(receiver);
} 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;
}
} /**
* 该接收者用于接收前台Activity发出的广播A,获取A中的TicketId,调用内部方法查询电影票信息,并发出广播B
* @author SHZ
*
*/
private class SendTicketInfoReceiver extends BroadcastReceiver
{ @Override
public void onReceive(Context context, Intent intent) {
int ticketId = intent.getIntExtra("TicketId", 0);
String ticketInfo = getTicketInfo(ticketId); // 发送本服务的一个自定义广播,前台Activity会监听该广播获取电影票信息
Intent sendIntent = new Intent();
sendIntent.setAction("com.shz.sendticketinfo");
sendIntent.putExtra("TicketInfo", ticketInfo);
sendBroadcast(sendIntent);
} } }
四、其他相关代码
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;
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shz.callservicebybroadcastreceiver"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.shz.localservice.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.shz.localservice.TicketService"></service>
</application> </manifest>
效果截图:

利用广播调用后台服务方法并根据方法返回的内容更新UI的更多相关文章
- [android] 代码注册广播接收者&利用广播调用服务的方法
利用广播调用服务里面的方法,间接的方式调用服务内部的方法,与现实中差不多,请媒体曝光 主界面里面 在界面创建的时候开启一下服务普通的startService()方法 发送一条广播出去 获取Intent ...
- SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法
最近项目组很多人问我,从前台页面传到后台controller控制层或者WebApi 时如何取值和运算操作. 今天就都大家一个在框架内一个取值技巧 前台JS调用代码: 1.下面是选中一行数据后右键点击时 ...
- Android -- service 利用广播调用服务的方法
1. 实现原理,在Service里面注册一个广播接收者, 想要调用的时候app发送出广播, 后台的service里面的广播接收者接收到广播,并调用service里面的方法. 2. 示例代码 MainA ...
- 关于datagrid中控件利用js调用后台方法事件的问题
前台调用后台方法除了用button的click事件,还可以用js调用 一.前台页面如图 需求点击这个按钮触发后台事件,从而能够调用存储过程 <epoint:HyperLinkColumn He ...
- C# 调用WCF服务的两种方法
项目简介 之前领导布置一个做单点登录的功能给我,实际上就是医院想做一个统一的平台来实现在这个统一的平台登录后不需要在His.Emr.Lis等系统一个个登录,直接可以登录到对应的系统,然后进行相应的操作 ...
- 学习之路十四:客户端调用WCF服务的几种方法小议
最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...
- 代码注册广播接收者&利用广播调用服务的方法服务声命周期(混合开启)
1)说明文档: 2)效果演示: 3)代码演示:
- 小记:利用递归调用循环寻找MP3文件的方法。
private void findMp3Data(File mp3file) { File[] filelist = mp3file.listFiles(); if (filelist != null ...
- Android 利用广播接收器启动服务
public class MainActivity extends Activity { private Button bt ; protected void onCreate(Bundle save ...
随机推荐
- java在线聊天项目0.6版 解决客户端关闭后异常问题 dis.readUTF()循环读取已关闭的socket
服务端对try catch finally重新进行了定义,当发生异常,主动提示,或关闭出现异常的socket 服务器端代码修改如下: package com.swift; import java.io ...
- html中注释的问题
在修改jsp页面的时候遇到了一个有点难懂的注释,mark一下 <script> <!-- alert("js code"); //--> </scri ...
- laravel模型关联与列表展示
上面这个是一个模型关联的图,其实我们很容易去理解 比如说,一对一,也就是说一个用户对应的是一个手机号. 一对多,比如说一篇文章可以有多条评论 一对多反向:如一篇文章可以有多条评论,但对应每条评论也只针 ...
- python的web框架---Django项目
Django项目之会议室预预订: 界面效果展示: 1.创建超级管理员,实现预定界面功能 2.预定界面: (一)基于pymysql设计数据表结构,理清前后端与用户交互逻辑.(用户表,会议室表,预定内容存 ...
- 学习Python第一天,命令很多跟Linux还有脚本语言相似。
学习Python第二天,看了一天,有点头疼,准备先休息一会,再继续.有一点C语言和Java基础,学起来不是很费劲.学习热情尚好. 学习了dir,math模块,import加载模块,有跟Linux相似的 ...
- IRQ中断处理流程
基于Linux2.6.30.4分析IRQ中断的处理流程. 1.中断入口 /* arch/arm/kenel/entry-armv.S*/ b vector_irq + stubs_offset 2.v ...
- 包含min的栈
#include <iostream> #include <stack> using namespace std; void push(stack<int> &am ...
- Ubuntu 16.04 LTS上git提交出现警告Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts. 的解决方法
问题: Ubuntu 16.04 LTS执行 git pull时总会出现以下警告: Warning: Permanently added 'github.com,52.74.223.119' (RSA ...
- SQLite Database Browser 2.0使用方法
在网上找一个SQLITE查看器 这个查看器叫做:www.jb51.net/database/118822.html 这个查看器可以新建SQLITE文件数据库,可以建立表索引,写SQL语句,编辑表数据 ...
- 三、harbor部署之SSL
1 签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名证书:由服务器自己颁发给自己,用于证明自己身份的东西,非权威颁发机构发布. 2 openssl简介 ...