利用广播调用后台服务方法并根据方法返回的内容更新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 ...
随机推荐
- Broadcast BCM94322 用ubuntu修改ID
1.按这个教程的6楼做的http://bbs.pcbeta.com/viewthread-1324168-1-1.html.注意我先下载 的是ubuntu9.05版本,做U盘启动进live 模式,43 ...
- 【Java_基础】java中的常量池
1.java常量池的介绍 java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池. java常量池简介:java常量池中保存了一份在 ...
- centOS下SVN安装和配置
1>SVN服务器端文件可见问题 在平时使用SVN时候,一直以为在客户提交文件,那么在服务器对应的版本库下面就会有相同文件.在自己搭建后,发现提交到服务器端文件完全看不见.... 这是由于SVN服 ...
- Elasticsearchs的安装/laravel-scout和laravel-scout-elastic的安装
安装: https://github.com/medcl/elasticsearch-rtf 先下载包 下载解压后 cd elasticsearch-rtf-master ll bin/elastic ...
- 有关linux的GPG签名验证错误的解决方法。
GPG签名验证错误:由于没有公钥,下列签名无法进行验证: NO_PUBKEY 6AF0E1940624A220 找了下原因,虽然不知道原理,不过大概意思还是能才出来的,解决方法如下: gpg --ke ...
- (转))iOS App上架AppStore 会遇到的坑
iOS App上架AppStore 会遇到的坑 前言:非原创 文章摘自:http://zhuanlan.zhihu.com/100000PM/20010725 相信大家一定非常「深恶痛疾」AppS ...
- S3C6410串口平台设备注册流程分析
1.mdesc->map_io() start_kernel -->setup_arch(&command_line); -->paging_init(mdesc); --& ...
- goland 快键键整理及注册
https://my.oschina.net/lemos/blog/1358731 http://idea.lanyus.com/
- SQL Server on Red Hat Enterprise Linux
本文从零开始一步一步介绍如何在Red Hat Enterprise Linux上搭建SQL Server 2017,包括安装系统.安装SQL等相关步骤和方法(仅供测试学习之用,基础篇). 一. 创 ...
- Oc_总结
1.定义类: @interface 类名 : 父类 @end 2.使用:(冒号)表示继承一个类 Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原 ...