文章目錄
後天就是2017了,提前祝大家新年快樂!最近忙得頭暈頭轉向的,難得有天輕鬆日!正好能給我時間寫篇博文,整理下知識!
首先,必須提出的是,概念性的東西在這裏就不手打了,如什麼是Intent,Intent如何使用!這裏最好查看官方文檔,說得比我說的詳細的多,而且更加全面。
文章目錄
實例一: 指定Action調用系統的Activity
實例三:Data屬性配置
實例四:使用Action,Data屬性啓動系統Activity
Intent啓動不同組件的方法
Activity
-
startActivity(Intent intent);
-
startActivityForResult(Intent intent,int requestCode);
Service
- componentName startService(Intent service);
- boolean bindService(Intent service,ServiceConnection conn, int flags);
BroadcastReceiver
- sendBroadcast(Intent intent);
- sendBroadcast(Intent intent,String receiverPermission)
- sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras);
- sendOrderedBroadcast(Intent intent,String receiverPermission)
- sendStickyBroadcast(Intent intent);
- sendStickyBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras)
Data,Type屬性與intent-filter配置
- Data通常用於給Action提供操作的數據,接受一個Uri對象。
Data的通常格式:content://com.android.contacts/contacts/1
Uri總滿足如下格式:scheme://host:post/path - Type屬性用於指定該Data屬性所指定的Uri對應的MIME類型,可以爲任何類型,只要符合abc/xyz格式的字符串即可。
**注意:這兩個屬性會相互覆蓋,如果希望Intent同時擁有的話,必須待用Intent的setDataAndType()方法. **
指定Action調用系統的Activity
啓動Activity的標準Action常量以及對應的字符串
標準的Category常量以及對應的字符串
實例一查看並獲取聯繫人電話
MainActivity代碼:
public class MainActivity extends Activity
{
final int PICK_CONTACT = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 爲bn按鈕綁定事件監聽器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 創建Intent
Intent intent = new Intent();
// 設置Intent的Action屬性
intent.setAction(Intent.ACTION_GET_CONTENT);
// 設置Intent的Type屬性
intent.setType("vnd.android.cursor.item/phone");
// 啓動Activity,並希望獲取該Activity的結果
startActivityForResult(intent, PICK_CONTACT);
}
});
}
@Override
public void onActivityResult(int requestCode
, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
case (PICK_CONTACT):
if (resultCode == Activity.RESULT_OK)
{
// 獲取返回的數據
Uri contactData = data.getData();
CursorLoader cursorLoader = new CursorLoader(this
, contactData, null, null, null, null);
// 查詢聯繫人信息
Cursor cursor = cursorLoader.loadInBackground();
// 如果查詢到指定的聯繫人
if (cursor.moveToFirst())
{
String contactId = cursor.getString(cursor
.getColumnIndex(
ContactsContract.Contacts._ID));
// 獲取聯繫人的名字
String name = cursor.getString(cursor
.getColumnIndexOrThrow(
ContactsContract.Contacts.DISPLAY_NAME));
String phoneNumber = "此聯繫人暫未輸入電話號碼";
//根據聯繫人查詢該聯繫人的詳細信息
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.
Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone. CONTACT_ID
+ " = " + contactId, null, null);
if (phones.moveToFirst())
{
//取出電話號碼
phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract
.CommonDataKinds.Phone.NUMBER));
}
// 關閉遊標
phones.close();
EditText show =(EditText)findViewById(R.id.show);
show.setVisibility(View.VISIBLE);
//顯示聯繫人的名稱
show.setText(name);
EditText phone =(EditText)findViewById(R.id.phone);
phone.setVisibility(View.VISIBLE);
//顯示聯繫人的電話號碼
phone.setText(phoneNumber);
}
// 關閉遊標
cursor.close();
}
break;
}
}
}
實例二:返回系統界面
// 創建Intent對象
Intent intent = new Intent();
// 爲Intent設置Action、Category屬性
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
實例三:Data屬性配置。
注意觀察:
- 如果目標組件<data…/>子元素只指定了android:scheme屬性,那麼只要Intent的Data屬性的scheme部分與android:scheme屬性相同,即可啓動該組件!
- 如果目標組件<data…/>子元素只指定了android:scheme,android:host屬性,那麼只要Intent的Data屬性的scheme,host部分與android:scheme,android:host屬性相同,即可啓動該組件!
- 如果目標組件<data…/>子元素只指定了android:scheme,android:host,android:port屬性,那麼只要Intent的Data屬性的scheme,host,port部分與android:scheme,android:host,android:port屬性相同,即可啓動該組件!
MainActivity代碼:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void scheme(View source)
{
Intent intent = new Intent();
// 只設置Intent的Data屬性
intent.setData(Uri.parse("lee://www.aserbao.org:1234/test"));
startActivity(intent);
}
public void schemeHostPort(View source)
{
Intent intent = new Intent();
// 只設置Intent的Data屬性
intent.setData(Uri.parse("lee://www.imerbao.org:8888/test"));
startActivity(intent);
}
public void schemeHostPath(View source)
{
Intent intent = new Intent();
// 只設置Intent的Data屬性
intent.setData(Uri.parse("lee://www.imerbao.org:1234/mypath"));
startActivity(intent);
}
public void schemeHostPortPath(View source)
{
Intent intent = new Intent();
// 只設置Intent的Data屬性
intent.setData(Uri.parse("lee://www.imerbao.org:8888/mypath"));
startActivity(intent);
}
public void schemeHostPortPathType(View source)
{
Intent intent = new Intent();
// 同時設置Intent的Data、Type屬性
intent.setDataAndType(Uri.parse("lee://www.imerbao.org:8888/mypath")
, "abc/xyz");
startActivity(intent);
}
}
AndroidManifest.xml代碼:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_scheme"
android:name=".SchemeActivity"
android:label="指定scheme的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data屬性的scheme是lee,即可啓動該Activity -->
<data android:scheme="lee" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_host"
android:name=".SchemeHostPortActivity"
android:label="指定scheme、host、port的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
port是8888即可啓動該Activity -->
<data android:scheme="lee"
android:host="www.imerbao.org"
android:port="8888" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_sp"
android:name=".SchemeHostPathActivity"
android:label="指定scheme、host、path的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 只要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
path是/mypath,即可啓動該Activity -->
<data android:scheme="lee"
android:host="www.imerbao.org"
android:path="/mypath" />
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_path"
android:name=".SchemeHostPortPathActivity"
android:label="指定scheme、host、port、path的Activity">
<intent-filter>
<action android:name="xx" />
<category android:name="android.intent.category.DEFAULT" />
<!-- 需要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
port是8888,且path是/mypath,纔可啓動該Activity -->
<data android:scheme="lee"
android:host="www.imerbao.org"
android:port="8888"
android:path="/mypath"/>
</intent-filter>
</activity>
<activity
android:icon="@drawable/ic_type"
android:name=".SchemeHostPortPathTypeActivity"
android:label="指定scheme、host、port、path、type的Activity">
<intent-filter>
<action android:name="xx"/>
<category android:name="android.intent.category.DEFAULT" />
<!-- 需要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
port是8888,且path是/mypath
且type是abc/xyz,纔可啓動該Activity -->
<data android:scheme="lee"
android:host="www.imerbao.org"
android:port="8888"
android:path="/mypath"
android:mimeType="abc/xyz"/>
</intent-filter>
</activity>
</application>
實例四:使用Action,Data屬性啓動系統Activity
MainActivity代碼:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button) findViewById(R.id.bn);
// 爲bn按鈕添加一個監聽器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 創建Intent
Intent intent = new Intent();
String data = "http://blog.csdn.net/qq_32175491";
// 根據指定字符串解析出Uri對象
Uri uri = Uri.parse(data);
// 爲Intent設置Action屬性
intent.setAction(Intent.ACTION_VIEW);
// 設置Data屬性
intent.setData(uri);
startActivity(intent);
}
});
Button edit = (Button) findViewById(R.id.edit);
// 爲edit按鈕添加一個監聽器
edit.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 創建Intent
Intent intent = new Intent();
// 爲Intent設置Action屬性(動作爲:編輯)
intent.setAction(Intent.ACTION_EDIT);
String data = "content://com.android.contacts/contacts/1";
// 根據指定字符串解析出Uri對象
Uri uri = Uri.parse(data);
// 設置Data屬性
intent.setData(uri);
startActivity(intent);
}
});
Button call = (Button) findViewById(R.id.call);
// 爲call按鈕添加一個監聽器
call.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 創建Intent
Intent intent = new Intent();
// 爲Intent設置Action屬性(動作爲:撥號)
intent.setAction(Intent.ACTION_DIAL);
String data = "tel:12345678911";
// 根據指定字符串解析出Uri對象
Uri uri = Uri.parse(data);
// 設置Data屬性
intent.setData(uri);
startActivity(intent);
}
});
}
總結:
本文主要介紹了Android系統中Intent的功能和用法,當Android應用需要啓動某個組件是,總需要藉助Intent來實現。不管啓動Activity還是Service,BroadcastReceiver組件,Android系統都是通過Intent來實現的。這裏講得知識一些基礎的使用方法,如果要深挖,建議研究下底層代碼!還是那句話,官方文檔很重要!
近段時間一直在研究如何寫好博文,給今後的自己一些回顧以及希望能給正在學習Android路上的初學者一些幫助!如果有什麼問題歡迎給我留言,看到及時回覆!
今天都已經31號了,文章準備了兩天!洗洗準備睡了,基礎知識點差不多都有寫到。明天起牀再修改下,準備發佈了!