分类: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的绑定的更多相关文章

  1. 【Android】17.3 Activity与StartedService的绑定

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 除了上一节介绍的基本绑定以外,你还可以创建一个同时支持started和bound的服务.也就是说,服务可以通过调用 ...

  2. Android Service总结05 之IntentService

    Android Service总结05 之IntentService   版本 版本说明 发布时间 发布人 V1.0 添加了IntentService的介绍和示例 2013-03-17 Skywang ...

  3. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  4. Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...

  5. 【原创】Android 从一个Activity跳转到另外一个Activity

    Android四大组件activity使用,实现两个activity之间的跳转 基本流程:创建两个activity-将其中一个activity中组件作为事件源-通过组件事件的处理借助intent对象实 ...

  6. Android中半透明Activity效果另法

    Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidMani ...

  7. [Android笔记1]Activity+Layout+Button

    线性布局(LinearLayout)是指view对象在父view中可按水平或垂直方向线性排列. 相对布局(RelativeLayout)是指view对象的排列依赖于各对象之间的相对位置. 下面是展示两 ...

  8. android 基础02 - Activity 的生命周期及状态

    返回栈 Android 中的 Activity 是可以层叠的,当我们启动一个新的 Activity 时,就会覆盖在原有的 Activity 之上, 点击 Back 会销毁当前 Activity,下面的 ...

  9. Android application 和 activity 标签详解

    extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...

随机推荐

  1. ZH奶酪:PHP遍历目录/文件的3种方法

    其实PHP中内建函数scandir()就可以返回目录下全部文件和目录了... ========================== 1.使用$obj = dir($dir)返回目录对象$obj,然后使 ...

  2. Windows 之 防火墙

          对于只使用浏览.电子邮件等系统自带的网络应用程序,Windows防火墙(firewall)根本不会产生影响.也就是说,用IE.OutlookExpress等系统自带的程序进行网络连接,防火 ...

  3. BeautifulSoup的成员结构

    >>> dir(soup)['ASCII_SPACES', 'DEFAULT_BUILDER_FEATURES', 'HTML_FORMATTERS', 'ROOT_TAG_NAME ...

  4. js toSting方法实现

    function toString (val: any): string { return val == null ? '' : typeof val === 'object' ? JSON.stri ...

  5. Linux see 网卡当前流量

    linux see网卡的当前流量 sar –n DEV  1 2  命令后面1 2 意思是:每一秒钟取1次值,取2次. DEV显示网络接口信息 -n参数很有用,他有6个不同的开关:DEV | EDEV ...

  6. el表达式 多条件判断

      el表达式 多条件判断 CreationTime--2018年9月13日08点59分 Author:Marydon 1.情景展示 ACCESS_ID == 'APP1039' 且 CARDTYPE ...

  7. [Done]SnowFlake 分布式环境下基于ZK构WorkId

    Twitter 的 Snowflake  大家应该都熟悉的,先上个图: 时间戳 序列号一般不会去改造,主要是工作机器id,大家会进行相关改造,我厂对工作机器进行了如下改造(估计大家都差不多吧,囧~~~ ...

  8. Geeks Union-Find Algorithm Union By Rank and Path Compression 图环算法

    相同是查找一个图是否有环的算法,可是这个算法非常牛逼,构造树的时候能够达到O(lgn)时间效率.n代表顶点数 原因是依据须要缩减了树的高度,也叫压缩路径(Path compression),名字非常高 ...

  9. JSP,servlet和数据库之间传值出现乱码的问题

     近期困扰我非常久的一个问题最终攻克了,为他我头疼了好几天,问题是JSP通过servlet向数据库传值,查询显示在页面的时候出现了乱码,原先我数据库中有两行带有中文的数据,查询的时候倒是没有出现乱 ...

  10. iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用

    场景说明: -之前做的App,使用Swift框架语言,混合编程,内含少部分OC代码. -需要App整体功能打包成静态库,完整移植到另一个App使用,该App使用OC. -所以涉及到一个语言互转的处理, ...