簡述
如果把每個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傳遞數據,建議使用下面的方式。
應用場景
在應用之間跳轉用隱式跳轉,在一個應用內進行跳轉用顯示跳轉。