android学习笔记之Intent与BroadcastReceiver(一)

说点零零碎碎便于以后参考:

隐式调用打电话:

if (somethingWeird && itDontLookGood) { 
       Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-2368”));
       startActivity(intent);

}

 

通常你要确保你的隐式调用找得到解决方案:

if (somethingWeird && itDontLookGood) { 
           // Create the impliciy Intent to use to start a new Activity. 
           Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(“tel:555-2368”));

           // 检查是否存在能执行该action的activity 
           PackageManager pm = getPackageManager(); 
           ComponentName cn = intent.resolveActivity(pm); 

           //如果没有,那么就去Google Play去找找看 
           if (cn == null) {  
              Uri marketUri = Uri.parse(“market://search?q=pname:com.myapp.packagename”); //指定app的包名 
              Intent marketIntent = new  Intent(Intent.ACTION_VIEW).setData(marketUri);

             //如果Google Play上有,那么就去下载一个APP来。             

              if (marketIntent.resolveActivity(pm) != null) 
                startActivity(marketIntent); 
              else

               //注意:不是每台设备都装了Google Play Store 
                Log.d(TAG, “Market client not available.”); 
           } 
           else 
              startActivity(intent);

}

 

如果你想启动另外个子activity,希望它结束后有返回值,那么:

private static final int PICK_CONTACT_SUBACTIVITY = 2;

private void startSubActivityImplicitly() { 
       Uri uri = Uri.parse(“content://contacts/people”); 
       Intent intent = new Intent(Intent.ACTION_PICK, uri); 
       startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

}

 

这里演示的是去取一个联系人的信息。

当子activity finish掉之前,只要setResult(int resultCode)或者setResult(int resultCode,Intent data)把数据放进去,这个方法的intent主要还是来放数据的(通常就是个URI,再多一点就是额外的extra键值对,bundle之类的,不解释了)。

通常来说resultCode无外乎2种,要么是Activity.RESULT_OK或者就是Activity.RESULT_CANCELED, 当然你如果要求比较严格的描述,那你可以自己定义个整形常量就可以了,既然有结果码,对应必然从父activity传来的请求码。。不解释了

setResult(RESULT_CANCELED);   //位置在finish之前。
finish();

那么父activity是如何接受到,子activity所返回的数据?

只需要重写onAcitivtyResult方法。(参数不解释了,太直观了)

 

介绍些常见的Action:

ACTION_ALL_APPS:打开一个acitivty,列出所有app。 这个通常也就laucher对它有兴趣了。

ACTION_ANSWER:  打开一个用来接受电话的activity.

ACTION_BUG_REPORT: 打开一个用来发布BUG的activity.

ACTION_CALL: 打电话的,不过这个根据你提供的号码,初始化打电话界面,但是不拔出!

ACTION_DIAL: 直接就拨出了。电话的URI写法不一:比如tel:555-1234或者tel:(212)555 212也是允许的。其它的不解释了。

ACTION_CALL_BUTTON: 这个就是那个刚刚初始化的打电话界面。

ACTION_DELETE: 顾名思义,根据提供的URI删除数据。

ACTION_EDIT: 提供一个能根据指定数据URI显示一个可编辑的界面。

ACTION_INSERT: 用来插入数据。

ACTION_PICK: 根据指定的数据URI,去获取一个联系人信息从Content Provider。 当被关闭,应该返回一个当前被选中的联系人的URI,比如URI:content://contacts/people将会调用原生的联系人列表。

image // 由于我这里木有联系人。。~。~

ACTION_SEARCH: 启动一个查找指定东西的Activity. 具体。。。先不说了,用到百度吧。

ACTION_SEARCH_LONG_PRESS:  这个典型的用在快捷的发音查找。

ACITON_SENDTO :   根据指定的联系人发送数据。

ACTION_SEND: 用来给远程的接受者发送数据。

ACTION_VIEW: 这个最最常用的action。 根据提供的数据URI显示各种合理的视图。主要看URI的模式是什么。比如http:的地址将会打开在浏览器,tel开头就是打电话的界面了,

geo:开头的显示指定位置在GoogleMap上,如果是联系人的content,那么显示联系人管理。

ACTION_WEB_SERACH 打开一个浏览器用于查询,基于使用的SearchManager.QUERY键。

还有些关于广播的ACTION,以后再说。

 

介绍Linkify

Linkify 是一个工具类,用来帮助创建TextView或者TextView的子类的超链接,通过正则表达式的匹配。

里面含的文本如果匹配指定的正则表达式,那么这文本将会被转化为可点击的超链接(点击超链接默认隐式调用startActivity(new Intent(Intent.ACITION_VIEW,uri)))。超链接的文本就是对应的uri。

你可以指定任何自定义的正则表达式被视为可点击的链接;为了方便,Linkify类预设了常见的内容类型。

原生的Linkify链接类型

Linkify预设的类型有web URLs,email地址,电话号码。 去应用一个预设类型,可以使用静态的Linkify.addLinks方法,参数中传递一个需要被应用的View和描述类型的位掩码常量.

如:WEB_URLS,EMAIL_ADDRESS,PHONE_NUMBERS和ALL。

例子:
TextView textView = (TextView)findViewById(R.id.myTextView);

Linkify.addLinks(textView,Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);

你也可以在XML中添加:
<TextView
  android:layout_width=”match_parent”
  android:layout_height=”match_parent”
  android:text=”@string/linkify_me”
  android:autoLink=”phone|email” //可选值有none,web,email,phone,all
/>

Tip:从上面我们已经明白,Linkify所做的本质工作:找到匹配所指定的(预设的也好,自定义的也好)正则表达式,然后这段字符串自动变为可点击的超链接。

创建自定义的链接表达式:

有时候,你想链接你自己的数据,那么你就需要去自定义linkify的表达式了。

例子:

这代码的大致思路是:构建基础Uri,先测试是否找得到Action为ACTION_VIEW和指定的Uri的activity,如果找不到,那么后面的工作就不需要做了,如果找到了,那么为myTextView添加这种超链接规则。

// 定义基础Uri
String baseUri = “content://com.paad.earthquake/earthquakes/”;

//接着就开始测试了。

PackageManager pm = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(baseUri));
boolean activityExists = testIntent.resolveActivity(pm) != null;

//如果存在的话,那么添加匹配模式并将textView拉进去折腾。

if (activityExists) {
   int flags = Pattern.CASE_INSENSITIVE;
   Pattern p = Pattern.compile(“\\bquake[\\s]?[0-9]+\\b”, flags);  //quake开头加上一串数字和可选的空格
  Linkify.addLinks(myTextView, p, baseUri);  这个是Linkify.addLinks的另外一个重载函数
}

但是只是简单这么做了可能会出问题,可能你需要处理下空格或者处理下字符之类需要处理的,不然生成的uri可能是非法的,这是Linkify.addLinks的另外个重载函数,多了2个参数
matchFilter, transformFilter,前者用来继续过滤,后者用来处理当前字符串以符合自个儿要求的字符串,最后再附加到baseUri上成为一个完整的uri.

DEMO:

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(“ “, “”); 
  } 
}

 

转载于:https://my.oschina.net/wangjunhe/blog/99947

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值