Android之Activity跳轉


簡述


  如果把每個activity看成一個頁面的話,那么activity之間的跳轉和頁面的之間的跳轉基本上是一樣的。首先需要監聽一個事件,當這個事件發生的時候,就進行跳轉。html中有個<a src="..."></a>的鏈接標簽,當我們點擊這個鏈接的時候就會發送跳轉。這是因為瀏覽器會自動監聽這個鏈接是否被點擊,如果被點擊那個瀏覽器自己執行跳轉動作。但是在Android中就沒這么簡單,程序員需要自己去監聽某個事件,當這個事件發生的時候,需要自己指定目的Activity,當然還可以攜帶一些數據傳遞給下一個Activity。原理上還是與頁面跳轉相同的。

顯示與隱式


跳轉分為隱式和顯示跳轉,顯示跳轉比較簡答,先簡述一下顯示跳轉。不同應用之間跳轉用隱式,同一應用跳轉用顯示

package xidian.dy.com.chujia;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    Button btn;
    private Button second2;
    private Button panel;
    private Button panel2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.second);
        second2 = (Button) findViewById(R.id.second2);
        panel = (Button) findViewById(R.id.panel);
        panel2 = (Button) findViewById(R.id.panel2);
        //顯示跳轉至第二個Activity
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
        //隱式跳轉到第二個Activity
        second2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("xidian.dy.com.chujia.se");
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                startActivity(intent);
            }
        });

        //隱式跳轉至撥號盤
        panel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_DIAL);
          inttent.setCategory(Intent.CATEGORY_DEFAULT); startActivity(intent); } });
//顯示跳轉至撥號盤 panel2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); //指定包名以及具體的Activity類名 intent.setClassName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivityForDialpad"); startActivity(intent); } }); } }

上面的代碼監聽了四個按鍵,當按鍵被按下的時候進行Activity的跳轉。在進行跳轉時,我們需要定義一個意圖對象(intent)來描述我們要干啥的細節,然后調用startActivity告訴系統啟動一個Activity,並把細節傳遞進去。跳轉分為顯示跳轉和隱式跳轉,下面進行詳細說明。

顯示跳轉

  • 同一應用跳轉

  一個APP中會有多個Activity,這些Activity之間進行跳轉時可以采用第一種方式 intent.setClass(MainActivity.this, SecondActivity.class); 第一個參數是當前的activity,第二個參數是要跳轉的Activity類文件

  • 跨應用跳轉

  要從一個APP的Activity跳轉到另一個,需要使用第四種方式 intent.setClassName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivityForDialpad"); 第一個參數是應用的包名,第二個參數是要跳轉的Activity的類名。

隱式跳轉


 

  隱式跳轉相對比較復雜,這里單獨拿出來說。

  首先,看一下清單文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xidian.dy.com.chujia">
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:label="主界面">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity" android:label="第二個界面">
            <intent-filter>
                <action android:name="xidian.dy.com.chujia.se" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

 

APP中Activity如果要顯示的話都需要在清單文件中進行注冊。

第二個Activity:

 <activity android:name=".SecondActivity" android:label="第二個界面"> .SecondActivity指定這個Activity對象的類文件,lable顯示在Activity的最上面,如果是主界面的話還會顯示在應用圖標下面。

 <action android:name="xidian.dy.com.chujia.se" /> 這里的值就和我們的隱式跳轉有關系了。在做隱式跳轉時,我們傳遞的字符串與這里的是一致的 intent.setAction("xidian.dy.com.chujia.se"); 。我們看到這個action是放在一個意圖過濾器中的,當我們調用setAction時,系統會通過我們的請求傳遞給過濾器,過濾器會根據不同請求給出不同的相應(有點像MVC中控制器)。

  <category android:name="android.intent.category.DEFAULT" /> 這里是對Activity的說明,如果沒有特殊需要一般是DEFAULT。

第一個Activity:

 <activity android:name=".MainActivity" android:label="主界面"> .MainActivity指定這個Activity對象的類文件,lable就是我們手機上顯示的應用圖標時下的文字。

 <action android:name="android.intent.action.MAIN" /> 這里name的值是有特殊含義的,這是告訴系統這是我應用的入口Activity

 <category android:name="android.intent.category.LAUNCHER" />  這是來說明我的應用啟動的時候就加載這個Activity,不要加載應用中其他的Activity。

隱式跳轉流程簡述

  當我們的點擊按鈕后會觸發監聽事件,然后創建一個意圖。對這個意圖設置屬性,然后過濾器會根據屬性找到具體的Activity類。這里的過濾匹配是完全匹配,我們設置的屬性不能多也不能少。清單文件中有幾個屬性,在設置的時候就應添加相同的屬性。在第二Activity中我們在過濾其中定義了兩個屬性,那么在創建意圖的時候也設置了兩個屬性。如果我們調用系統的Activity的話可以傳遞常量給意圖。

數據傳輸


 

在Activity中如果需要使用到數據傳輸的話,可以參考一下代碼。

清單文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xidian.dy.com.chujia">
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:label="主界面">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity" android:label="第二個界面">
            <intent-filter>
                <action android:name="xidian.dy.com.chujia.se" />
                <data android:scheme="my" android:mimeType="text/password" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

 

 主布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="這是主Activity"/>
        <Button
            android:id="@+id/second"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="顯示跳轉至子Activity"/>
</LinearLayout>

子布局 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是第二個Activity"
        />
</LinearLayout>

 

MainActivity.java 

package xidian.dy.com.chujia;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.second);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("xidian.dy.com.chujia.se");
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setDataAndType(Uri.parse("my:123456"), "text/password");
                startActivity(intent);
            }
        });

    }
}

 

SecondActivity.java 

package xidian.dy.com.chujia;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;

/**
 * Created by dy on 2016/7/2.
 */
public class SecondActivity extends AppCompatActivity{
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        Log.i("SecondActivity", intent.getDataString());
    }
}

 注意:雖然我們可以通過Data攜帶一些數據過來,但是畢竟類型有限,這里的話如果需要向下一個Activity傳遞數據,建議使用下面的方式。

 

 應用場景


在應用之間跳轉用隱式跳轉,在一個應用內進行跳轉用顯示跳轉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM