Android 4 学习(12):Linkify & Broadcast event
参考《Professional Android 4 Development》
Linkify
Linkfy类可以在Text View中创建超链接。匹配LInkify中正则表达式的文本将被Linkify转为超链接,这些链接将隐式调用startActivity方法。Linkify类中包含默认类型如电话号码,email地址和web地址,使用方法如下:
TextView textView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
除此之外,还可以在配置文件里面进行配置:
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/linkify_me"
android:autoLink="phone|email"
/>
自定义Linkify
String baseUri = "content://com.paad.earthquake/earthquakes/"; // Contruct an Intent to test if there is an Activity capable of viewing the content you are Linkifying. Use the Package Manager to perform the test.
PackageManager pm = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(baseUri));
boolean activityExists = testIntent.resolveActivity(pm) != null; // If there is an Activity capable of viewing the content linkify the text.
if (activityExists) {
int flags = Pattern.CASE_INSENSITIVE;
Pattern p = Pattern.compile("\\bquake[\\s]?[0-9]+\\b", flags);
Linkify.addLinks(myTextView, p, baseUri);
}
testIntent是用于测试能否View对应的Activity。在上面的代码片段中,任何匹配正则表达式p的字符串都可以生成Link,而不仅仅是baseUri。可以使用TransformFilter或MatchFilter来解决这个问题,下面是TransformFilter和MatchFilter的例子:
Linkify.addLinks(myTextView, p, baseUri, new MyMatchFilter(), new MyTransformFilter());
class MyMatchFilter implements MatchFilter {
public boolean acceptMatch(CharSequence s, int start, int end) {
return (start == 0 || s.charAt(start-1) != '!');
}
}
class MyTransformFilter implements TransformFilter {
public String transformUrl(Matcher match, String url) {
return url.toLowerCase().replace(“ “, “”);
}
}
使用Intent实现Broadcast Event
使用sendBroadcast方法发送广播
public static final String NEW_LIFEFORM_DETECTED = “com.paad.action.NEW_LIFEFORM”;
Intent intent = new Intent(LifeformDetectedReceiver.NEW_LIFEFORM);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LIFEFORM_NAME, detectedLifeform);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LONGITUDE, currentLongitude);
intent.putExtra(LifeformDetectedReceiver.EXTRA_LATITUDE, currentLatitude);
sendBroadcast(intent);
Intent构造函数中的String用于唯一标识这个Intent,一般由包名+说明符构成。
使用Broadcast Receiver监听Broadcast
Broadcast Receiver必须注册后才能使用,注册有两种方法,一种是在代码中注册,另一种是在配置文件中注册,后者也被称为manifest receiver。通过继承BroadcastReceiver类,即可实现自己的Receiver:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: React to the Intent received.
}
}
onReceive在主线程中执行,因此它必须快速执行完。onReceive方法的执行时间被限制为5秒,否则将出现Force Close的对话框。这个时间决定了BroadcastReceiver不会包含具体处理Broadcast的逻辑,更多地是进行启动其他的Activity,Service等操作。下面是一个BroadcastReceiver的示例代码:
public class LifeformDetectedReceiver extends BroadcastReceiver {
public final static String EXTRA_LIFEFORM_NAME = “EXTRA_LIFEFORM_NAME”;
public final static String EXTRA_LATITUDE = “EXTRA_LATITUDE”;
public final static String EXTRA_LONGITUDE = “EXTRA_LONGITUDE”;
public static final String ACTION_BURN = “com.paad.alien.action.BURN_IT_WITH_FIRE”;
public static final String NEW_LIFEFORM = “com.paad.alien.action.NEW_LIFEFORM”;
@Override
public void onReceive(Context context, Intent intent) {
// Get the lifeform details from the intent.
Uri data = intent.getData();
String type = intent.getStringExtra(EXTRA_LIFEFORM_NAME);
double lat = intent.getDoubleExtra(EXTRA_LATITUDE, 0);
double lng = intent.getDoubleExtra(EXTRA_LONGITUDE, 0);
Location loc = new Location(“gps”);
loc.setLatitude(lat);
loc.setLongitude(lng);
if (type.equals(“facehugger”)) {
Intent startIntent = new Intent(ACTION_BURN, data);
startIntent.putExtra(EXTRA_LATITUDE, lat);
startIntent.putExtra(EXTRA_LONGITUDE, lng);
context.startService(startIntent);
}
}
}
在代码中注册Broadcast Receiver:
public static final String NEW_LIFEFORM = “com.paad.alien.action.NEW_LIFEFORM”;
....
private IntentFilter filter = new IntentFilter(LifeformDetectedReceiver.NEW_LIFEFORM);
private LifeformDetectedReceiver receiver = new LifeformDetectedReceiver();
....
@Override
public void onResume() {
super.onResume();
// Register the broadcast receiver.
registerReceiver(receiver, filter);
}
@Override
public void onPause() {
// Unregister the receiver
unregisterReceiver(receiver);
super.onPause();
}
在配置文件中注册BroadcastReceiver:
<receiver android:name=”.LifeformDetectedReceiver”>
<intent-filter>
<action android:name=”com.paad.alien.action.NEW_LIFEFORM”/>
</intent-filter>
</receiver>
广播Ordered Intent
使用sendOrderedBroadcast方法可以广播有序的Intent。有序的Intent可以设置Permission,只有具有Permission的Receiver才能处理这个Intent:
String requiredPermission = “com.paad.MY_BROADCAST_PERMISSION”;
sendOrderedBroadcast(intent, requiredPermission);
BroadcastReceiver可以在配置文件中配置Permission:
<receiver
android:name=”.MyOrderedReceiver”
android:permission=”com.paad.MY_BROADCAST_PERMISSION”>
<intent-filter
android:priority=”100”>
<action android:name=”com.paad.action.ORDERED_BROADCAST” />
</intent-filter>
</receiver>
在上面的代码中,android:priority可以用于设置BroadcastReceiver的优先级。sendOrderedBroadcast方法可以设置一个最终的Receiver以及initialResult, initialData和initialExtras:
// Specify the default result, data, and extras.
// The may be modified by any of the Receivers who handle the broadcast before being received by the final Receiver.
int initialResult = Activity.RESULT_OK;
String initialData = null;
String initialExtras = null;
// A special Handler instance on which to receive the final result.
// Specify null to use the Context on which the Intent was broadcast.
Handler scheduler = null;
sendOrderedBroadcast(intent, requiredPermission, finalResultReceiver, scheduler, initialResult, initialData, initialExtras);
finalResultReceiver将被添加到Receiver链的末端,从而保证最后一个处理Intent。, initialData和initialExtras可以被任意一个Receiver链中的BroadcastReceiver处理。
广播Sticky Intent
使用sticky intent,我们可以不使用Receiver获取广播Intent,示例如下:
IntentFilter battery = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent currentBatteryCharge = registerReceiver(null, battery);
设置IntentFilter来filter一个Sticky Intent,即可通过调用registerReceiver获取此Sticky Intent的信息。
发送自定义的Sticky Intent:
sendStickyBroadcast(intent);
删除Sticky Inent:
removeStickyBroadcast(intent);
Android 4 学习(12):Linkify & Broadcast event的更多相关文章
- Android开发学习之路--Broadcast Receiver之初体验
学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyB ...
- Android 4 学习(13):Local Broadcast Manager & Intent Filter
参考<Professional Android 4 Development> Local Broadcast Manager 简介 Local Broadcast Manager由Andr ...
- 我的Android 4 学习系列之文件、保存状态和首选项
目录 使用Shared Preference 保留简单的应用程序数据 保存回话间的Activity实例数据 管理应用程序首选项和创建Preference Screen 保存并加载文件以及管理本地文件系 ...
- Android:日常学习笔记(7)———探究UI开发(1)
Android:日常学习笔记(7)———探究UI开发(1) 常用控件的使用方法 TextView 说明:TextView是安卓中最为简单的一个控件,常用来在界面上显示一段文本信息. 代码: <T ...
- Android:日常学习笔记(2)——分析第一个Android应用程序
Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Android Animation学习(四) ApiDemos解析:多属性动画
Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
随机推荐
- <img>边框的border属性
默认地,图像是没有边框的(除非图像在 a 元素内部). 浏览器通常会把代表超链接的图像(例如包含在 <a> 标签中的图像)显示在两个像素宽的边框里面,以表示读者可以通过选择这个图像来访问相 ...
- [eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置
[eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置 https://github.com/dotnet-architecture/eShopOnContain ...
- 《转》 EJB到底是什么,真的那么神秘吗??
1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么 ...
- input text 不显示输入的历史记录
当之前的text框输入了数据后,下次输入有历史记录问题的解决方法 怎么禁止输入框记录输入记录,双击input出现输入过的记录, 有过表单设计经验的朋友肯定知道,当我们在浏览器中输入表单信息的时候,往往 ...
- Today is weekend不是应该一定会输出吗
判断语句 If…else块,请看下面这个例子: <%! int day = 3; %> //声明变量感叹号 <html> <head><title>IF ...
- SWF文件加密、混淆
简单说下SWF文件的混淆原理,(已经明白的请跳过本段):我们的AS源代码被编译完成后,SWF内部会形成一个字符串映射表,包含源码里出现的所有字符串(类名,包名,成员变量名,常量等).一个数字(相当于地 ...
- [Scala]Scala学习笔记二 数组
1. 定长数组 如果你需要一个长度不变的数组,可以使用Scala中的Array. val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0 val str ...
- keras&tensorflow+分布式训练︱实现简易视频内容问答框架
内容来源:Keras 之父讲解 Keras:几行代码就能在分布式环境训练模型 把 Keras API 直接整合入 TensorFlow 项目中,这样能与你的已有工作流无缝结合.至此,Keras 成为了 ...
- css3: scrollLeft,scrollWidth,clientWidth,offsetWidth 的区别
(需要提一下:CSS中的margin属性,与clientWidth.offsetWidth.clientHeight.offsetHeight均无关) offsetwidth:是元素相对父元素的偏移宽 ...
- Go语言的序列化与反序列化(gob)
encoding/gob包实现了高效的序列化,特别是数据结构较复杂的,结构体.数组和切片都被支持. 实现代码如下://定义一个结构体type Student struct { Name string ...