【Android】16.3 带Intent过滤器的Services
分类:C#、Android、VS2015;
创建日期:2016-03-01
一、简介
这一节演示带Intent过滤器的Services的基本用法。
1、配置Intent Filter
不论是本地解决方案还是远程解决方案,都可以通过intent过滤器显式指定要调用的是哪个已启动的服务。换言之,Intent过滤器主要解决的问题是:在Activity中调用StartService方法启动自定义的Service类以后,通过Intent过滤器指定调用的是已启动的服务中的哪些服务(过滤掉其他的服务)。当然,其他应用程序也可以用这种方式来实现。
在C#代码中,可以用[IntentFilte(…)]特性声明来自动注册Intent过滤器,其作用就像可以用[Service]特性声明自动注册服务一样,也是让系统自动修改AndroidManifest.xml配置文件,而不需要我们去手工在AndroidManifest.xml文件中注册配置信息。
例如,下面的代码将Intent过滤器与 mj.demos.DemoService 关联在一起:
namespace ServiceDemo1
{
[Service]
[IntentFilter(new String[]{"mj.demos.ServiceDemo1"})]
public class MyService : Service
{
……
}
}
通过C#代码声明Service特性和IntentFilter特性以后,系统就会自动在AndroidManifest.xml文件中添加下面的配置:
<service android:name="servicedemo1.MyService">
<intent-filter>
<action android:name="mj.demos.MyService" />
</intent-filter>
</service>
其中,“servicedemo1.MyService”中的servicedemo1是将命名空间ServiceDemo1全部变为小写字母后的结果,MyService是自定义的服务名。
这样一来,就可以在任何类中调用StartService方法,并在参数中传递Intent过滤器。例如,下面的代码演示了如何在某个Activity中传递Intent过滤器:
StartService (new Intent ("mj.demos.MyService"));
下面的代码演示了如何停止过滤服务:
StopService (new Intent ("mj.demos.MyService"));
2、通知用户
利用前面章节介绍的通知用户的办法,可将后台运行的Service的状态或结果告诉用户,比如传输一个大文件时,告诉用户后台传输已完成等。
二、示例2--StartedServiceDemo2
该例子与上一节介绍的StartedServiceDemo1的运行结果相同。不同的是在这个例子中添加了Intent过滤器。
运行截图

主要设计步骤
(1)添加ch1602_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/ch1602StartService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="启动服务" />
<Button
android:id="@+id/ch1602StopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止服务" />
</LinearLayout>
(2)添加ch1602ServiceDemo.cs
using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Widget;
using System.Threading; namespace MyDemos.SrcDemos
{
[Service]
[IntentFilter(new string[] { action })]
public class ch1602ServiceDemo : Service
{
public const string action = "MyDemos.ch1602Service";
Thread thread; [return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
var myHandler = new Handler(MainLooper);
myHandler.Post(() =>
{
Toast.MakeText(this, "服务已启动", ToastLength.Short).Show();
});
thread = new Thread(() =>
{
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();
});
}
StopSelf();
});
thread.Start();
return StartCommandResult.Sticky;
} public override void OnDestroy()
{
base.OnDestroy();
thread.Abort();
new Handler(MainLooper).Post(() =>
{
Toast.MakeText(this, "服务已停止", ToastLength.Short).Show();
});
} //基类要求实现的接口
public override IBinder OnBind(Intent intent)
{
return null;
}
}
}
(3)添加ch1602MainActivity.cs
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget; namespace MyDemos.SrcDemos
{
[Activity(Label = "ch1602MainActivity")]
public class ch1602MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch1602_Main); var start = FindViewById<Button>(Resource.Id.ch1602StartService);
start.Click += delegate
{
StartService(new Intent(ch1602ServiceDemo.action));
}; var stop = FindViewById<Button>(Resource.Id.ch1602StopService);
stop.Click += delegate
{
StopService(new Intent(ch1602ServiceDemo.action));
};
}
}
}
【Android】16.3 带Intent过滤器的Services的更多相关文章
- Android开发-API指南-Intent和Intent过滤器
Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...
- Android——Intent和Intent过滤器
http://www.cnblogs.com/XP-Lee/p/3613830.html Intent就是一个激活组件的消息对象,用于组件之间的通信.需要注意的是,能被Intent激活通信的组件只有三 ...
- Android编程权威指南(第2版)--第16章 使用intent拍照 挑战练习
16.7挑战练习:优化照片显示 新建dialog_photo.xml 1234567891011121314 <?xml version="1.0" encoding=&qu ...
- Android组件的通讯——Intent
转载:Android组件的通讯-Intent 1.概述 一个应用程序的三个核心组件——activities.services.broadcast receivers,都是通过叫做intents的消息激 ...
- Android应用开发中Intent的作用及使用方法
Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...
- 【Android】12.1 Intent基本概念
分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 Intent:意图,含义就是你想利用它调用哪个组件实现相关的功能,比如调用相机组件实现拍照.调用Contact组件 ...
- Android开发学习之Intent具体解释
Intent简单介绍和具体解释: Intent:协助应用间的交互与通信,Intent负责相应用中一次操作的动作.动作涉及的数据.附加数据进行描写叙述. ...
- 【Android】自带Theme
[Android]自带Theme android之uses-permission 在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
随机推荐
- 《Java程序设计》第16周周四:GUI编程及文件对话框的使用
第一部分:实验项目 项目一:文件及选择 目的:了解文件对话框的用法,熟悉GUI中事件驱动的核心步骤. 1. 阅读博文 "JFileChooser (Java Swing提供的文件选择对话框 ...
- ArcEngine开发各种几何错误代码
E_GEOMETRY_AMBIGUOUSPARTTYPE - Static variable in interface com.esri.arcgis.geometry.esriGeometryErr ...
- 过滤器(web基础学习笔记二十一)
一.过滤器简介 二.在Eclipse中创建过滤器 三.使用过滤器设置全部web字符编码 public void doFilter(ServletRequest request, ServletResp ...
- vue provide和inject使用
provide和inject使用场景也是组件传值,尤其是祖父组件--孙组件等有跨度的组件间传值,单向传值(由provide的组件传递给inject的组件). provide 选项应该是一个对象或返回一 ...
- eclipse could not create the Java Vitual Machine
eclipse could not create the Java Vitual Machine CreateTime--2018年4月27日11:07:15 Author:Marydon 1.情 ...
- JUC-闭锁:CountDownLatch
CountDownLatch::闭锁,在完成某些运算是,只有其他所有线程的运算全部完成,当前运算才继续执行. 实例化:参数:设置一个计数器的值. final CountDownLatch latch ...
- java 和 C 代码运行效率的比较(整理)
最近和朋友无意间讨论起了 有关java 和C 的 效率问题, (我是java 推介者, 他是 c 语言推介者, 他做的是嵌入式) 故,想通过网络查询一下, 总结一下,两者到底效率如何,其有何差异,原因 ...
- iptables阐述防火墙
一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...
- default
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- cxf之org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 37; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'jaxws:server' 的声明。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...