Intent
在Android中Intent非常常用,是個強大的本地交互工具。
Intent是什麼?
英文翻譯爲“意圖”,我理解爲可以攜帶數據的指令。
能幹嘛?比如:
微信支付成功後會跳轉回原來的頁面並提示已經支付成功
分享功能,點擊分享會出現朋友圈,微博的選擇界面給你選擇並分享內容
知識點總結
一.Activity之間的頁面跳轉
Intent i = new Intent(本頁面.this,需要跳轉的頁面.class);
startActivity(i);
二.App頁面的數據傳輸
數據傳輸
放入數據
private static final String TAG ="Mainactivity" //先自定義一個值爲Mainactivity的String常量 ....... Intent i = new Intent(本頁面.this,需要跳轉的頁面.class); i.putExtra(TAG,數據); //添加標識字符串和數據值 startActivity(i)
跳轉的頁面獲取數據
Intent i = getIntent(); String str = i.getStringExtra("Mainactivity"); //通過分析值來分析常量名再來分析攜帶的數據,提高數據的安全性
三.數據傳輸並能返回結果
用
startActivityForResult
啓動pravate fianl static int Code = 0; //自定義一個int數值 ...... Intent i = new Intent(本頁面.this,需要跳轉的頁面.class); i.putExtra(TAG,數據); startActivityForResult(i,Code); //添加一個識別代碼,用來識別是從那個頁面返回的數據
跳轉的頁面獲取數據並用
setResult
返回結果值pravate fianl static String RETURTAG = "return" //定義個返回的常量 ....... Intent i = getIntent(); String str = i.getStringExtra(數據); Intent intent = new Intent(); intent.putExtra(RETURTAG,數據); setResult(RESULT_OK,i); //返回一個int類型的RESULT_OK結果值
主頁面重寫
onActivityResult
protect void onActivityResult(int requetCode,int resultCode,Intent data){ if(requestCode == code){ //如果要求的requestCode和此頁面的Code對應 if(resultCode == RESULT_OK) //如果結果值成功 ...... //執行操作 }
四.不同應用之間的交互
分享文本信息給其他應用
Intent i = new Intent(); i.putExtra(Intent.EXTRA_TEXT, 數據); //使用Intent自帶的String常量攜帶數據 i.setAction(Intent.ACTION_SEND); //設置行爲信息 i.setType("text/plain"); //設置傳送數據種類 startActivity(i);
分享圖片
i.putExtra(Intent.EXTRA_STREAM, uriToImage); //uriToImage爲圖片鏈接 i.setType("image/jpeg");
發送多塊內容
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // 添加你的圖片地址 imageUris.add(imageUri2) ......... i.setAction(Intent.ACTION_SEND_MULTIPLE); i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); i.setType("image/*"); ........
可以在
startActivit``中
createChooser`自定義選擇程序界面的標題startActivity(Intent.createChooser(i,"選擇你要啓動的程序"))
五.Intent接收其他程序的數據並處理
清單文件在
<activity>
中添加<intent-filter>
<intent-filter > <action android:name="android.intent.action.SEND"/> //匹配接收的行爲信息值 <category android:name="android.intent.category.DEFAULT"/> //匹配類型,此處爲默認值,Intent.ACTION_SEND屬於默認值 <data android:mimeType="text/plain"/> //匹配數據類型 </intent-filter>
處理接收到的數據
此處要注意避免在UI線程中處理獲取到的數據
protected void onCreate(Bundle savedInstanceState) { ....... Intent i =getIntent(); String action =i.getAction(); String type=i.getType(); //若從Intent中取得的行爲信息和數據種類相對應,執行方法handIntent if(Intent.ACTION_SEND.equals(action) && type != null){ if("text/plain".equals(type)){ handIntent(i); } } } ...... public void handIntent(Intent i){ String str = i.getStringExtra("Intent.EXTRA_TEXT"); // 執行UI更新操作 }
六.示例:發送一段文字顯示在另一個APP上
寫一段文字發送
選擇接收的APP,選擇IntentFilter
在接收頁面顯示你輸入的文字
示例代碼
test的代碼
MainActivity.
protected void onCreate(Bundle savedInstanceState) { ...... Button button = (Button)findViewById(R.id.button2); EditText et = (EditText)findViewById(R.id.editText1); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub String sentText = et.getText().toString(); Intent i = new Intent(); i.setAction(Intent.ACTION_SEND); i.putExtra(Intent.EXTRA_TEXT, sentText); i.setType("text/plain"); startActivity(i); } }); }
IntentFilter的代碼
MainActivity.
protected void onCreate(Bundle savedInstanceState) { ....... TextView text = (TextView)findViewById(R.id.text); Intent i =getIntent(); String action =i.getAction(); String type=i.getType(); if(Intent.ACTION_SEND.equals(action) && type != null){ if("text/plain".equals(type)){ handIntent(i); } }} .......... //定義個處理接收數據的方法 public void handIntent(Intent i){ String getText = i.getStringExtra(Intent.EXTRA_TEXT); if (getText != null){ text.setText(getText); }
清單文件.
<intent-filter > <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> </intent-filter>