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(「 「, 「」); 
  } 
}
相關文章
相關標籤/搜索