分类: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. 几种流行Webservice框架性能对比(转载)

    1摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性能上存在较大差 ...

  2. Hibernate(三)结构-配置文件-实体映射及配置文件

    一.体系结构 SessionFactory:属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照.Session的工厂.有可能持有一个可选的数据缓存可以进程级别或者群级别保存可以在事务中 ...

  3. [SQL]查询某一个字段在某一段时期数据库中使用到的记录

    有些时候我们常常须要哪里用到了一些表,又或者什么时候运行了某一个存储过程.整理出了在某段时期内数据库运行的sql查询.也能够查询到数据库中某些字段的存放处.非常好非常强大.希望能帮到大家~ SELEC ...

  4. 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener

    使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解,那么JUnit将会采用默认的执行类Suite执行,如下类: public  ...

  5. 远程binlog

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  6. MVC MVP MVVM 图解

    1.MVC (1)图解 解释: 视图(View):用户界面. 控制器(Controller):业务逻辑 模型(Model):数据保存 各部分之间的通信方式如下: View 传送指令到 Controll ...

  7. 修改终端下vim的PopupMenu选种项的背景颜色

    我平常比较喜欢使用终端下的 VIM,最方便的就是随时可以使用ctrl+z切换到终端下执行命令, 然后再通过fg切换回 VIM.如果再有个透明效果,那就更赞了.不过最近换了一个配色ron 后, 有个比较 ...

  8. jsp页面获取集合的长度

      createTime--2016年10月12日16:20:02Author:Marydonjsp页面获取集合的长度 在jsp页面与js中不能通过${list.size}取列表长度,而是引入jstl ...

  9. python之函数用法__getitem__()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法__getitem__() #http://www.cnblogs.com/hongf ...

  10. 推荐10 款 SVG 动画的 JavaScript 库

    SVG 通常可以用作跨分辨率视频.这意味着在一块高分屏幕上不会降低图片的锐度.此外,你甚至可以让SVG动起来,通过使用一些javascript类库.下面,我们分享一些javascript类库,这些类库 ...