• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 安卓開發之Intent使用介紹(顯式Intent和隱式Intent)

    標簽: 安卓學習  安卓

    Intent

    Intent是 Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用于啟動活動、啟動服務以及發送廣播等場景,這次我們運用在啟動活動上面。

    Intent大致可以分為兩種:顯式Intent和隱式Intent,我們先來看一下顯式Intent如何使用。
    首先我創建了2個活動.
    1.FirstActivity(第一個活動)

    package activitytest.example.administrator.activitytest;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class FirstActivity extends AppCompatActivity {
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.add_item:
                    Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.remove_item:
                    Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
                    break;
                default:
            }
            return true;
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main,menu);
            return true;
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
            Button button1 = (Button) findViewById(R.id.button_1);
            button1.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    }
    

    第一個活動的配置文件(first_layout.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:id="@+id/button_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button 1" />
    </LinearLayout>
    

    2.SecondActivity(第二個活動)

    package activitytest.example.administrator.activitytest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class SecondActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.second_layout);
        }
    }
    

    第二個活動的配置文件(second_layout.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/second_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="activitytest.example.administrator.activitytest.SecondActivity">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/button_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button 2"/>
    </LinearLayout>
    </RelativeLayout>
    
    

    總的配置文件(AndroidManifest.xml):

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="activitytest.example.administrator.activitytest">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity
                android:name=".FirstActivity"
                android:label="This is FirstActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".SecondActivity"></activity>
        </application>
    
    </manifest>
    

    Intent有多個構造函數的重載,其中一個是Intent(Context packageContext,Class<?>cls)。這個構造函數接收兩個參數,第一個參數Context要求提供一個啟動活動的上下文,第二個參數class 則是指定想要啟動的目標活動,通過這個構造函數就可以構建出Intent的”意圖”。然后我們應該怎么使用這個Intent呢? Activity 類中提供了一個startActivity()方法,這個方法是專門用于啟動活動的,它接收一個Intent參數,這里我們將構建好的Intent傳入startActivity()方法就可以啟動目標活動了。

    FirstActivity 中按鈕的點擊事件的代碼如下所示:

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                    startActivity(intent);
                }
    

    我們首先構建出了一個Intent,傳入 FirstActivity.this 作為上下文,傳入SecondActivity.class 作為目標活動,這樣我們的“意圖”就非常明顯了,即在FirstActivity這個活動的基礎上打開SecondActivity這個活動。然后通過startActivity()方法來執行這個Intent.
    運行結果:
    在這里插入圖片描述
    這時候已經切換到了第二個應用.
    在這里插入圖片描述
    可以看到,我們已經成功啟動SecondActivity這個活動了。如果你想要回到上一個活動怎么辦呢?很簡單,按下Back鍵就可以銷毀當前活動,從而回到上一個活動了。
    使用這種方式來啟動活動,Intent的“意圖”非常明顯,因此我們稱之為顯式 Intent

    隱式Intent

    相比于顯式Intent,隱式Intent則含蓄了許多,它并不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的action和 category 等信息,然后交由系統去分析這個Intent,并幫我們找出合適的活動去啟動。
    什么叫作合適的活動呢?簡單來說就是可以響應我們這個隱式Intent的活動,那么目前SecondActivity可以響應什么樣的隱式Intent呢?額,現在好像還什么都響應不了,不過很快就會有了。

    通過在標簽下配置的內容,可以指定當前活動能夠響應的action和 category,打開AndroidManifest.xml,添加如下代碼:

    <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="activitytest.example.administrator.activitytest.ACTION_START"></action>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    

    !這里的activitytest.example.administrator.activitytest是活動所在的地址
    在這里插入圖片描述
    在標簽中我們指明了當前活動可以響應activitytest.example.administrator.activitytest.ACTION_START這個action,而標簽則包含了一些附加信息,更精確地指明了當前的活動能夠響應的Intent中還可能帶有的category。只有和中的內容同時能夠匹配上Intent中指定的action和 category時,這個活動才能響應該Intent。
    修改FirstActivity 中按鈕的點擊事件,代碼如下所示:

             @Override
                public void onClick(View v) {
                    Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
                    startActivity(intent);
                }
    

    可以看到,我們使用了Intent 的另一個構造函數,直接將action的字符串傳了進去,表明我們想要啟動能夠響應activitytest.example.administrator.activitytest.ACTION_START這個action的活動。那前面不是說要和同時匹配上才能響應的嗎?怎么沒看到哪里有指定category呢?這是因為android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category添加到 Intent中。
    重新運行程序,在FirstActivity 的界面點擊一下按鈕,你同樣成功啟動SecondActivity了。不同的是,這次你是使用了隱式Intent 的方式來啟動的,說明我們在標簽下配置的action和 category 的內容已經生效了!
    運行結果:
    在這里插入圖片描述
    在這里插入圖片描述
    每個Intent中只能指定一個action,但卻能指定多個category。目前我們的Intent中只有一個默認的category,那么現在再來增加一個吧。
    修改FirstActivity中按鈕的點擊事件,代碼如下所示:

       public void onClick(View v) {
                    Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
                    intent.addCategory("activitytest.example.administrator.activitytest.MY_CATEGORY");
                    startActivity(intent);
                }
            });
    

    現在我們在AndroidManifest.xml的中再添加一個category的聲明,如下所示:

    <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="activitytest.example.administrator.activitytest.ACTION_START"></action>
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="activitytest.example.administrator.activitytest.MY_CATEGORY"/>
            </intent-filter>
        </activity>
    

    再次重新運行程序,你就會發現一切都正常了。

    謝謝大家觀看,周某不才, 剛剛學Android開發, 如有問題和建議,歡迎指出來。

    望君與吾共進

    版權聲明:本文為I_r_o_n_M_a_n原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/I_r_o_n_M_a_n/article/details/109825637

    智能推薦

    隱式Intent

    啟動自己程序內的Activity 不明確指出啟動哪一個活動,指定一系列action和category,信息交給系統處理,找到適合啟動的活動。 只有當action和category中的內容同時匹配Intent中指定的action和category時,Intent才能被啟動。 AndroidManifest.xml 因為android.intent.category.DEFAULT是默認的catego...

    Android Studio(五)CriminalIntent—隱式intent、使用intent拍照

    Android Studio(五)CriminalIntent—5.隱式intent、6.使用intent拍照 隱式intent 使用intent拍照 Android編程權威指南 第3版 第15、16章 學習總結 代碼來源于《Android編程權威指南》第三版 14-4F-8A-A2-D1-90 60 7 14-4F-8A-A2-D1-90 60 8 以下操作基于上一個blog已完成的...

    Android Intent 隱式與顯式意圖

    意圖的應用場景:一般開啟系統的應用用隱式意圖 開啟自己應用的界面用顯示意圖   1,隱式意圖 :通過指定一組動作和數據來開啟頁面     【1】注意事項,當setdata方法和settype方法清除效果,我們是使用intent.setDataAndType方法     ★setType 方法 會自動清楚set...

    Intent詳解(一)----顯、隱式開啟Activity

    Intent開啟Activity 1.Intent的作用 Intent是一個可以消息傳遞對象,可以通過它來進行組件之間的信息傳遞。Intent主要有以下三個作用: l  開啟一個activity l  開啟一個service l  發送廣播消息 本篇主要介紹Intent如何開啟一個Activity。 Intent可以啟動Activity,啟動的方式有顯式啟動和隱式啟動...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡