1. 程式人生 > >顯式intent和隱式intent

顯式intent和隱式intent

this .text 接收 Coding 南京 聲明 menuitem ret 處理

android其中顯式intent和隱式intent的差別
定義:
  Intent定義:Intent是一種在不同組件之間傳遞的請求消息。是應用程序發出的請求和意圖。

作為一個完整的消息傳遞機制,Intent不僅須要發送端,還須要接收端。
  顯式Intent定義:對於明白指出了目標組件名稱的Intent。我們稱之為顯式Intent。
  隱式Intent定義:對於沒有明白指出目標組件名稱的Intent。則稱之為隱式Intent。
顯示Intent直接指明了被啟動的的類的定義 
比方一個實例: 
Mainactivity.java
package com.example.root.longpra;

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);/*綁定activity*/
findViewById(R.id.startbtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,AnoAct.class));
/*像這樣的非常明白的指出了被啟動的類的定義的就是顯示Intent*/
}
});
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}
AnoAct.java
package com.example.root.longpra;

import android.app.Activity;
import android.os.Bundle;

/**
* Created by root on 15-8-22.
*/
public class AnoAct extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.anoact);/*綁定anoact*/
}
}

通過字符串來啟動activity
AndroidManifest.xml
<?

xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.root.longpra" >

<application
android:allowBackup="true"
android:icon="@mipmap/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:name=".AnoAct"
android:label="LongPra">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<!--android.intent.category.DEFAULT指名這個intent-filter這個行為方式為一個activity-->
<action android:name="com.example.root.longpra.intent.action.AnoAct"/>
<!--action能夠為隨意字符串。僅僅要在啟動的過程啟用這個字符串就可以-->
</intent-filter>>
</activity>>
</application>

</manifest>

MainActivity.java
package com.example.root.longpra;

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);/*綁定activity*/
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(AnoAct.ACTION));
/*像這樣的非常明白的指出了被啟動的類的定義的就是顯示Intent*/
}
});
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}
AnoAct.java
package com.example.root.longpra;

import android.app.Activity;
import android.app.Notification;
import android.os.Bundle;

/**
* Created by root on 15-8-22.
*/
public class AnoAct extends Activity {
public static final String ACTION = "com.example.root.longpra.intent.action.AnoAct";//在這邊定義這個字符串微一個常量。這樣當外面須要調用這個activity時候能夠直接使用ACTION
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.anoact);/*綁定anoact*/
}
}
新建一個app1。在Mainctivity中
package com.example.root.app1;

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent("com.example.root.longpra.intent.action.AnoAct"));
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}
這樣能夠直接啟動app中的AnoAct。以上就是隱示的intent
說明:Android系統使用IntentFilter來尋找與隱式Intent相關的對象。
  詳解:
  顯式Intent直接用組件的名稱定義目標組件,這樣的方式非常直接。

可是因為開發者往往並不清楚別的應用程序的組件名稱。因此,顯式Intent很多其它用於在應用程序內部傳遞消息。比方在某應用程序內,一個Activity啟動一個Service。
  隱式Intent恰恰相反。它不會用組件名稱定義須要激活的目標組件。它更廣泛地用於在不同應用程序之間傳遞消息。
  在顯式Intent消息中。決定目標組件的唯一要素就是組件名稱,因此,假設你的Intent中已經明白定義了目標組件的名稱。那麽你就全然不用再定義其它Intent內容。
  而對於隱式Intent則不同。因為沒有明白的目標組件名稱。所以必須由Android系統幫助應用程序尋找與Intent請求意圖最匹配的組件。
  Android系統尋找與Intent請求意圖最匹配的組件詳細的選擇方法
是:Android將Intent的請求內容和一個叫做IntentFilter的過濾器比較,IntentFilter中包括系統中全部可能的待選組件。
  假設IntentFilter中某一組件匹配隱式Intent請求的內容。那麽Android就選擇該組件作為該隱式Intent的目標組件。


  Android怎樣知道應用程序可以處理某種類型的Intent請求呢?這須要應用程序在Android-Manifest.xml中聲明自己所含組件的過濾器(就可以以匹配哪些Intent請求)。
  一個沒有聲明Intent-Filter的組件僅僅能響應指明自己名字的顯式Intent請求,而無法響應隱式Intent請求。
  而一個聲明了IntentFilter的組件既能夠響應顯式Intent請求。也能夠響應隱式Intent請求。

在通過和
IntentFilter比較來解析隱式Intent請求時,Android將下面三個因素作為選擇的參考標準。
  Action
  Data
  Category

  而Extra和Flag在解析收到Intent時是並不起作用的。


鐘誌遠 江蘇南京 904727147

顯式intent和隱式intent