【Android】17.4 Activity与IntentService的绑定
2024-10-19 06:22:06
分类: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;
}
}
}
}
最新文章
- ios学习资源
- hdu2874 LCA在线算法
- C#单链表
- jQuery 遍历(上)
- nyoj 203 三国志 dijkstra+01背包
- [OrangePi] Installation on internal EMMC
- HDU 5688 Problem D map
- js常用方法收集
- Datawindow.net 子数据窗口出错
- Linux共享库两种加载方式简述
- java基础解析系列(十一)---equals、==和hashcode方法
- 【一天一道LeetCode】#290. Word Pattern
- android studio 编辑markdown文件
- qt 安装包生成2
- Linux.Centos安装scp反复失败的解决方式
- 20155333 《网络对抗》Exp3 免杀原理与实践
- CI Weekly #22 | flow.ci 新版 iOS 构建流程的 4 大变化
- 值得一看!2018年最优秀的9个Android Material Design Apps!
- mybatis中调用游标,存储过程,函数
- ConcurrentBag同线程元素的添加和删除
热门文章
- Proguard随笔
- IIS 之 线程池最大线程数
- 微信小程序 - 反编译线上源码
- Linux一些基本命令一(学习笔记三)
- 触发器二(DML触发器)(学习笔记)
- weblogic.servlet.proxy.HttpProxyServlet 进行代理设置
- or1200中载入存储类指令说明
- html5之canvas画图 1.写字板功能
- Debian GNU Linux服务列表的获取、服务的关闭/开启、服务在启动时是否自己主动执行的生效/失效
- Python处理JSON(转)