android學習筆記:Intent,Intent Filter

Intent的作用

Intent在android中可以用來請求一個動作,用於啓動另外一個控件,Intent可以啓動三種控件如下

  • 啓動一個activity,可以使用startActivity(),如果你想啓動activity之後返回結果,那麼啓動的時候調用startActivityForResult(),然後當前的activity實現onActivityResult(),當被啓動的activity結束時,可以回調該方法,並返回結果

  • 啓動一個service,service是一般用來在後臺進行一些操作,通過startService()方法來啓動service

  • 啓動boardcast(廣播)通過調用sendBroadcast()

Intent的類型

  • 顯示類型,顯示指定要啓動的控件的類型,通常用來啓動activity

Intent i = new Intent();
i.stClass(MainActivity.this,OtherActivity.class);
startActivity(i);

  • 隱式類型 不直接指名要啓動控件的名字,但是通過指定action與data來啓動,通常用來啓動其他app的activity,比如打電話的界面,相冊,地圖等。

先說一下Intent Filter吧,在說如何發送隱式intent,這樣會好理解一些

Intent Filter

intent filter 是intent的過濾器,他可以對隱式的intent進行過濾,我的理解是當發送一個intent時,android系統會匹配各個應用中intent filter,查看intent filter 是否是當前intent要被啓動的。

intent filter 中可以添加如下屬性(manifest文件中設置)

  • action: 動作的名稱,通常是系統定義好的值,如ACTION_SEND,或ACTION_VIEW,通過

  • data:intent附帶的數據。通過指定他的值,可以使用一個或者多個屬性,我們可以只定義MIME type或者是隻指定URI prefix,也可以只定義一個URI scheme,或者是他們綜合使用。

  • category:提供一個附加的方法來標識這個activity能夠handle的intent。通常與用戶的手勢或者是啓動位置有關。系統有支持幾種不同的categories,但是大多數都很少用到。而且,所有的隱式intent都默認是 CATEGORY_DEFAULT 類型的。在intent filter中用指定它的值。
    還有一點需要特別注意:**intent-filterfilter>中必須有category標籤,不然應用就會奔潰,category屬性一般指定爲
    < category android:name=”android.intent.category.LAUNCHER” />

驗證是否有App去接收這個Intent

Caution: 如果觸發了一個intent,而且沒有任何一個app會去接收這個intent,則app會crash(奔潰掉)。

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities =     packageManager.queryIntentActivities(intent, 0);        
boolean isIntentSafe = activities.size() > 0;

下面是一個例子

<activity android:name="MainActivity">

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="ShareActivity">

<intent-filter>
    <action android:name="android.intent.action.SEND"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain"/>
</intent-filter>

</activity>

設置intent

  • 設置component 發送intent可以添加控件的名字,用於顯示啓動控件

*設置action,如果啓動的控件爲自己定義的,一般我們用包名來作爲action名字的前綴,來和我們系統衆多的action區分開

static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
  • 設置data,一般設置一些電腦號碼,email地址等需要傳遞給要啓動控制的數據

*設置catogory,一般不需要設置,默認大多數的隱式intent的intent-filter中的catogory爲默認的屬性

  • 設置extra
    這個用到的比較多,比方說我們想傳遞要給一個數據給另外一個activity時,就可以用到

putExtra()或者使用putExtras

下面是一些其他intent的例子

  • 帶有指定電話號碼的intent:

    Uri number = Uri.parse("tel:5551234");
    Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
    
  • 查看地圖:

    Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
    Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); 
    Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
    
  • 查看網頁

    Uri webpage = Uri.parse("http://www.android.com");
    Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
    

至於另外一些需要extra數據的隱式 intent,我們可以使用 putExtra() 方法來添加那些數據。 默認的,系統會根據Uri數據類型來決定需要哪些合適的MIME type。如果我們沒有在intent中包含一個Uri, 則通常需要使用 setType() 方法來指定intent附帶的數據類型。設置MIME type 是爲了指定應該接受這個intent的activity。例如:

  • 發送一個帶附件的email:

    Intent emailIntent = new Intent(Intent.ACTION_SEND);
    emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
    emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
    
  • 創建一個日曆事件

    Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
    Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
    Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
    calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
    calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
    calendarIntent.putExtra(Events.TITLE, "Ninja class");
    calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
    
發佈了47 篇原創文章 · 獲贊 8 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章