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

说点零零碎碎便于之后参考: java

隐式调用打电话:

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);

}

 

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

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

一般来讲resultCode无外乎2种,要么是Activity.RESULT_OK或者就是Activity.RESULT_CANCELED, 固然你若是要求比较严格的描述,那你能够本身定义个整形常量就能够了,既然有结果码,对应必然从父activity传来的请求码。。不解释了 正则表达式

setResult(RESULT_CANCELED);   //位置在finish以前。
finish();
浏览器

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

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

 

介绍些常见的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(“ “, “”); 
  } 
}
相关文章
相关标签/搜索