【Android】17.4 Activity与IntentService的绑定
分类:C#、Android、VS2015;
创建日期:2016-03-03
一、简介
本示例通过AlarmManager类以固定的时间间隔调用服务(每隔2秒更新一次随机生成的股票数据)。如果将此示例的代码改为定期调用一次Web服务,就能轻松实现股票在线更新的功能。
二、示例3运行截图
本示例在Android 4.4.2(API 19)中运行正常(右侧屏幕中的数据会自动每2秒更新一次),但在Android 6.0(API 23)模拟器中AlarmManager不起作用,原因未知,所以这里截取的是在Android 4.4.2模拟器中运行的效果。
三、主要实现步骤
1、添加Json引用
有些股票数据是以JSON格式提供的,如果希望读取JSON格式的数据,需要添加Json引用。
由于本例子实际并未使用它,所以不添加也可以。
具体添加办法如下:鼠标右击项目中的“引用”,然后选择Systm.Json:
2、添加Internet访问权限
股票一般都是通过Internet发布的,如果访问股票的Web服务,还需要添加Internet访问权限(如果已经添加过就不用添加了):
<uses-permission android:name="android.permission.INTERNET" />
当然,由于这个例子中并没有真正访问Internet,不添加这个权限也可以。
3、添加ch1703_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="15dp"
android:text="test" />
4、添加ch1703SockService.cs
using System;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.OS; namespace MyDemos.SrcDemos
{
[Service]
[IntentFilter(new string[] { StocksUpdatedAction })]
public class ch1703StockService : IntentService
{
IBinder binder;
public List<Stock> Stocks { get; private set; }
public const string StocksUpdatedAction = "StocksUpdated";
List<string> stockSymbols = new List<string>() { "联动A股", "深深B股", "宇平A股", "塔塔B股", "乖乖A股", "果果C股" };
Random r = new Random(); protected override void OnHandleIntent(Intent intent)
{
UpdateStocks();
var stocksIntent = new Intent(StocksUpdatedAction);
SendOrderedBroadcast(stocksIntent, null);
} public override IBinder OnBind(Intent intent)
{
binder = new StockServiceBinder(this);
return binder;
} //此处调用股票的Web服务返回结果,为简化起见,这里用随机数直接返回了模拟的结果
private void UpdateStocks()
{
Stocks = new List<Stock>();
for (int i = 0; i < stockSymbols.Count; i++)
{
Stocks.Add(new Stock() { Symbol = stockSymbols[i], LastPrice = r.Next(10, 151) });
}
}
} public class StockServiceBinder : Binder
{
public ch1703StockService service { get; private set; }
public StockServiceBinder(ch1703StockService service)
{
this.service = service;
}
} public class Stock
{
public string Symbol { get; set; }
public float LastPrice { get; set; }
public override string ToString()
{
return string.Format("[Stock: Symbol={0}, LastPrice={1}]", Symbol, LastPrice);
}
}
}
5、添加ch1703MainActivity.cs
注意该类继承自ListActivity。
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "【例17-3】绑定到IntentService")]
public class ch1703MainActivity : ListActivity
{
bool isBound = false;
StockServiceBinder binder;
StockServiceConnection stockServiceConnection;
StockReceiver stockReceiver;
Intent stockServiceIntent; protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
stockReceiver = new StockReceiver(this); stockServiceIntent = new Intent(ch1703StockService.StocksUpdatedAction);
stockServiceConnection = new StockServiceConnection(this);
BindService(stockServiceIntent, stockServiceConnection, Bind.AutoCreate); var intentFilter = new IntentFilter();
intentFilter.AddAction(ch1703StockService.StocksUpdatedAction);
intentFilter.Priority = (int)IntentFilterPriority.HighPriority;
RegisterReceiver(stockReceiver, intentFilter);
var alarm = (AlarmManager)GetSystemService(AlarmService);
var a = PendingIntent.GetService(
this, 0, stockServiceIntent, PendingIntentFlags.UpdateCurrent);
//每2秒更新一次
alarm.SetRepeating(AlarmType.Rtc, 0, 2000, a);
} protected override void OnDestroy()
{
if (isBound == true)
{
UnbindService(stockServiceConnection);
isBound = false;
}
UnregisterReceiver(stockReceiver);
base.OnDestroy();
} private void UpdateStocks()
{
if (isBound)
{
var stocks = binder.service.Stocks;
if (stocks != null)
{
ListAdapter = new ArrayAdapter<Stock>(this,
Resource.Layout.ch1703_main, stocks);
}
}
} private class StockReceiver : BroadcastReceiver
{
ch1703MainActivity activity;
public StockReceiver(ch1703MainActivity activity)
{
this.activity = activity;
}
public override void OnReceive(Context context, Intent intent)
{
activity.UpdateStocks();
}
} private class StockServiceConnection : Java.Lang.Object, IServiceConnection
{
ch1703MainActivity activity; public StockServiceConnection(ch1703MainActivity activity)
{
this.activity = activity;
} public void OnServiceConnected(ComponentName name, IBinder service)
{
var stockServiceBinder = service as StockServiceBinder;
if (stockServiceBinder != null)
{
var binder = (StockServiceBinder)service;
activity.binder = binder;
activity.isBound = true;
}
} public void OnServiceDisconnected(ComponentName name)
{
activity.isBound = false;
}
}
}
}
【Android】17.4 Activity与IntentService的绑定的更多相关文章
- 【Android】17.3 Activity与StartedService的绑定
分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 除了上一节介绍的基本绑定以外,你还可以创建一个同时支持started和bound的服务.也就是说,服务可以通过调用 ...
- Android Service总结05 之IntentService
Android Service总结05 之IntentService 版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...
- Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...
- Android Service与Activity之间通信的几种方式
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...
- 【原创】Android 从一个Activity跳转到另外一个Activity
Android四大组件activity使用,实现两个activity之间的跳转 基本流程:创建两个activity-将其中一个activity中组件作为事件源-通过组件事件的处理借助intent对象实 ...
- Android中半透明Activity效果另法
Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidMani ...
- [Android笔记1]Activity+Layout+Button
线性布局(LinearLayout)是指view对象在父view中可按水平或垂直方向线性排列. 相对布局(RelativeLayout)是指view对象的排列依赖于各对象之间的相对位置. 下面是展示两 ...
- android 基础02 - Activity 的生命周期及状态
返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...
- Android application 和 activity 标签详解
extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...
随机推荐
- 算法笔记_168:历届试题 矩阵翻硬币(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义: ...
- PHP 表单和用户输入
PHP 的 $_GET 和 $_POST 用于检索表单中的值,比如用户输入. index.php页面 <?php /*时间:2014-09-14 *作者:葛崇 *功能:表单传值小实例 * ...
- Linux网卡高级命令
网卡的高级命令 [root@gechong ~]# mii-tool No interface specified usage: mii-tool [-VvRrwl] [-A media,... | ...
- 谷歌浏览器禁止window.close的问题
当一个窗口不是通过window.open或者window.showModalDialog打开的时候,调用JS的window.close() 谷歌浏览器会提示如下警告,并拒绝执行 Scripts may ...
- 使用JDK自带的JAXB进行类和xml的互转
Classroom.java public class Classroom { private int id; private String name; private int grade; publ ...
- import 如何工作
# -*- coding: utf-8 -*- #python 27 #xiaodeng #import 如何工作 #程序第一次导入指定文件时,会执行三个步骤 #1)找到模块文件 #2)编译成位码(需 ...
- python之模块csv之CSV文件一次写入多行
# -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件一次写入多行 import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很多程序 ...
- 18、Java中可变参数
从JDK 1.5之后,Java允许定义形参可变的参数 例如: public void test(int a,String ... books){ for(String book:books){ Sys ...
- OpenWrt中对USB文件系统的操作, 以及读写性能测试
参考 http://h-wrt.com/en/doc/flash 1. 查看usb存储在启动日志中的信息 # dmesg [ 5.720000] usbcore: registered new int ...
- HDUOJ-----4512吉哥系列故事——完美队形I(LCIS)
吉哥系列故事——完美队形I Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...