顯式intent和隱式intent

                 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時是並不起做用的。java


鍾志遠  江蘇南京  904727147
android

相關文章
相關標籤/搜索