分类:C#、Android、VS2015;

创建日期:2016-03-01

一、简介

为了进一步简化Intent过滤器的用法,Android系统又提供了一个IntentService类,这样一来,你也不需要重写其他的方法了,直接实现一个继承自IntentService的类,然后重写OnHandleIntent方法即可。

IntentService类继承自Service类。这个类自动使用工作线程处理所有Service的启动请求(即:对IntentService的每次请求都会自动启动一个线程去处理它)。

因为大多数started服务都不需要“并发”处理多个请求(这实际上是一个危险的多线程情况),所以最佳方式也许就是用IntentService类来实现你的服务。

总之,只要Started Service不需要“并发”处理多个请求,首选的办法就是用IntentService来实现。

1、IntentService的工作机制

IntentService将自动执行以下步骤:

创建一个缺省的工作(worker)线程,它独立于应用程序主线程来执行所有发送到OnStartCommand方法的intent。

创建一个工作队列,每次向你的OnHandleIntent()传入一个intent,这样你就永远不必担心多线程问题了。

在处理完所有的启动请求后,终止服务,因此你就永远不需调用StopSelf方法了。

提供缺省的OnBind()实现代码,它返回null。

提供缺省的OnStartCommand()实现代码,它把intent送入工作队列,稍后会再传给你的OnHandleIntent()实现代码。

以上所有步骤将汇成一个结果:你要做的全部工作就是实现OnHandleIntent()完成客户端提交的任务。(当然你还需要为服务提供一小段构造方法。)

2、实现OnHandleIntent方法

实现IntentService请求的代码很简单,你要做的工作就是在自定义的继承自IntentService类中重写OnHandleIntent()方法即可,它会自动接收每个启动请求的intent,然后自动在后台完成Intent请求的工作。

下面的代码演示了如何重写OnHandleIntent()方法:

[Service]
[IntentFilter(new string[]{"com.xamarin.DemoIntentService"})]
public class DemoIntentService: IntentService
{
public DemoIntentService () : base("DemoIntentService")
{
} protected override void OnHandleIntent (Android.Content.Intent intent)
{
Console.WriteLine ("perform some long running work");
Console.WriteLine ("work complete");
}
}

继承自IntentService的类与继承自Service的自定义类的区别是:继承自IntentService的类需要通过构造函数传递给基类一个字符串,该字符串的作用是标识内部工作线程。

从内部实现代码上来看,IntentService实际上就是把每个Intent发送的请求都放到一个工作队列中,然后分别在不同的线程中处理工作队列中的每个请求,由于这些Intent都是在与主线程不同的单独线程中运行的,当然不会阻止主线程的运行。

当某个Intent处理完后,IntentService会立即自动调用StopSelf方法停止这个Intent。

总之,利用IntentService,我们既不需要在服务中去显式创建单独的线程,也不需要在重写的Ondestroy方法中终止自己创建的线程,这一些都由IntentService类去自动实现,你只需要关注在服务中实现的功能就行了。

二、示例3--IndentServiceDemo

运行截图

  

主要设计步骤

(1)添加ch1603_Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/ch1603StartService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="启动服务" />
<Button
android:id="@+id/ch1603StopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止服务" />
</LinearLayout>

(2)添加ch1603ServiceDemo.cs

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
using System.Threading; namespace MyDemos.SrcDemos
{
[Service]
[IntentFilter(new string[] { action })]
public class ch1603ServiceDemo : IntentService
{
public const string action = "MyDemos.ch1603Service"; public ch1603ServiceDemo() : base("ch1603ServiceDemo")
{
} protected override void OnHandleIntent(Intent intent)
{
var myHandler = new Handler(MainLooper);
myHandler.Post(() =>
{
Toast.MakeText(this, "服务已启动", ToastLength.Short).Show();
});
for (int i = 1; i <= 10; i++)
{
var msg = string.Format("这是来自服务的第{0}个消息", i);
Thread.Sleep(TimeSpan.FromSeconds(4));
myHandler.Post(() =>
{
Toast.MakeText(this, msg, ToastLength.Short).Show();
});
}
} public override void OnDestroy()
{
base.OnDestroy();
new Handler(MainLooper).Post(() =>
{
Toast.MakeText(this, "服务已停止", ToastLength.Short).Show();
});
}
}
}

(3)添加ch1603MainActivity.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "ch1603MainActivity")]
public class ch1603MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1603_Main);
var start = FindViewById<Button>(Resource.Id.ch1603StartService);
start.Click += delegate
{
StartService(new Intent(ch1603ServiceDemo.action));
}; var stop = FindViewById<Button>(Resource.Id.ch1603StopService);
stop.Click += delegate
{
StopService(new Intent(ch1603ServiceDemo.action));
};
}
}
}

【Android】16.4 IntentService类的更多相关文章

  1. Android 进阶16:IntentService 使用及源码解析

    It's time to start living the life you've only imagined. 读完本文你将了解: IntentService 简介 IntentService 源码 ...

  2. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Android端Http访问类(转)

    本章目的 在上一章中,我们利用Hibernate Tools完成了Android Model层的建立,依赖Hibernate Tools的强大功能,自动生成了Model层.在本章,我们将继续我们的项目 ...

  3. 29个android开发常用的类、方法及接口

    在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...

  4. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  5. Top 16 Java 应用类 - 这些功能再也不用自己写了

    Java中有很多应用类.这些类定义静态方法能够解决非常多常见的问题.以下是通过5万个开源项目统计得到的最热门的16个应用类. 类按热门程序排列.类的方法也是按热门程序排序. 浏览这个类能够看看有哪些功 ...

  6. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  7. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...

  8. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  9. Android 通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

随机推荐

  1. Android 之布局(一)

    Android的布局类型: 主要有:LinearLayout(线性布局).RelativeLayout(相对布局).TableLayout(表格布局).AbsoluteLayout(绝对布局).Fra ...

  2. UIKeyboardTypeNumberPad 数字键盘添加完成按钮

    一:添加通知 //数字键盘添加完成 [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(keyboardWi ...

  3. 微信小程序 - 自定义tabbar

    更新: 2019-1-18:自定义tabbar组件已发布 各种奇葩的需求,造就了我们 wxml <view class="nav-tabs"> <view cla ...

  4. PHP高级教程-安全邮件

    PHP Secure E-mails 在上一节中的 PHP e-mail 脚本中,存在着一个漏洞. PHP E-mail 注入 首先,请看上一章中的 PHP 代码: <html> < ...

  5. Java从零开始学六(运算符)

    运算符 一.赋值运算符号 No. 赋值运算符号 描述 1 = 赋值 int num=22; System.out.println("num= "+num); num=num-3; ...

  6. BIOS和Bootloader的对比

    桌面电脑刚加电时,一个叫做BIOS的软件程序立刻获得了处理器的控制权.(历史上,BIOS是Basic Input/Output Software的缩写,但现在这个单词已经有了自身的含义,因为其完成的功 ...

  7. 怎样以Root方式执行Xcode

    粗略算一下,在第一次接触OSX的时候,我接触Windows已经有14年,刚開始用OSX和Xcode各种不习惯.可是用Xcode写了一星期的代码,我却有一种想把Windows和VS扔了的感觉(真的用着非 ...

  8. 为什么要有GDT

    逻辑地址-------------->线性地址------------> 物理地址   分段 分页 GDT是[gobal (segment) descriptor table]的缩写,它保 ...

  9. 一些常见http状态码

    # encoding=utf-8 #python 2.7.10 #xiaodeng #http状态码 #HTTP权威指南 10页 #一些常见状态码: 200 OK,文档正确返回 302 重定向,到其他 ...

  10. SET GLOBAL FOREIGN_KEY_CHECKS取消外键约束

    今天在工作中遇到的问题,在删除一个表时报错,发现有外键约束,所以不能删除,查了下发现需要取消外键约束. SET GLOBAL FOREIGN_KEY_CHECKS=0;全局取消外键约束 SET SES ...