之前博文《Android學習筆記之——activity》已經對Android開發的activity做了基本的介紹了。但是,在啓動器中點擊應用的圖標只會進入到該應用的主活動,本博文學習一下由主活動跳轉到其他活動。
目錄
創建second activity
仍然還是右擊com.example.activitytest包→New→Activity→Empty Activity,會彈出一個創建活動的對話框
Android Studio會爲我們自動生成SecondActivity.java和second_layout.xml這兩個文件。
打開Layout,編輯second_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_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"
/>
</LinearLayout>
對於SecondActivity
package com.example.activitytest;
import androidx.appcompat.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);
}
}
任何一個活動都是需要在AndroidManifest.xml中註冊的,不過幸運的是,Android Studio已經自動完成了,可以打開AndroidManifest.xml瞧一瞧:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<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>
</application>
</manifest>
由於SecondActivity不是主活動,因此不需要配置<intent-filter> 標籤裏的內容,註冊活動的代碼也簡單了許多。現在第二個活動已經創建完成。
啓動第二個活動——Intent
Intent是Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啓動活動、啓動服務以及發送廣播等場景。本博文先介紹一下Intent啓動活動
顯式Intent
Intent有多個構造函數的重載,其中一個是
Intent(Context packageContext, Class<?>cls)
這個構造函數接收兩個參數,
- 第一個參數Context 要求提供一個啓動活動的上下文
- 第二個參數Class 則是指定想要啓動的目標活動
通過這個構造函數就可以構建出Intent的“意圖”。Activity類中提供了一個startActivity() 方
法,這個方法是專門用於啓動活動的,它接收一個Intent 參數,所以只需要將構建好的Intent傳入startActivity() 方法就可以啓動目標活動了。
將博文文Android學習筆記之——activity》中的按鈕點擊代碼改爲:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
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 {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重寫
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
//構建出intent的“意圖”
startActivity(intent);//啓動活動
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
// //點擊按鈕時就會執行監聽器中的onClick() 方法。
// @Override //表示重寫
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
// //通過靜態方法makeText() 創建出一個Toast對象
// //並通過show()將Toast顯示出來
//
// // makeText() 方法需要傳入3個參數。
// // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// // 第二個參數是Toast顯示的文本內容,
// // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
隱式Intent
對於隱式Intent並不明確指出我們想要啓動哪一個活動,而是指定了一系列更爲抽象的action 和category 等信息,然後交由系統去分析這個Intent,並幫我們找出合適的活動去啓動。
在AndroidManifest.xml中。SecondActivity配置<intent-filter> 標籤裏的內容,可以指定當前活動能夠響應的action 和category(類別)
只有<action> 和<category> 中的內容同時能夠匹配上Intent中指定的action 和category時,這個活動才能響應該Intent。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity"></activity>
<intent-filter>
<action android:name="com.example.ActivityTest.ACTION_START" />
//在<action> 標籤中我們指明瞭當前活動可以響應
com.example.activitytest.ACTION_START 這個action
<category android:name="android.intent.category.DEFAULT" />
//更精確地指明瞭當前的活動能夠響應的Intent中還可能帶有的category
</intent-filter>>
<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>
</application>
</manifest>
然後修改FirstActivity中按鈕的點擊事件:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
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 {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重寫
public void onClick(View v) {
Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//構建出intent的“意圖”
startActivity(intent);//啓動活動
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //構建出intent的“意圖”
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
// //點擊按鈕時就會執行監聽器中的onClick() 方法。
// @Override //表示重寫
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
// //通過靜態方法makeText() 創建出一個Toast對象
// //並通過show()將Toast顯示出來
//
// // makeText() 方法需要傳入3個參數。
// // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// // 第二個參數是Toast顯示的文本內容,
// // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
得到的效果與顯示intent一樣的
每個Intent中只能指定一個action ,但卻能指定多個category 。
目前我們的Intent中只有一個默認的category ,那麼現在再來增加一個吧。
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
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 {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重寫
public void onClick(View v) {
Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
//構建出intent的“意圖”
intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
//調用Intent中的addCategory() 方法來添加一個category
startActivity(intent);//啓動活動
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //構建出intent的“意圖”
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
// //點擊按鈕時就會執行監聽器中的onClick() 方法。
// @Override //表示重寫
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
// //通過靜態方法makeText() 創建出一個Toast對象
// //並通過show()將Toast顯示出來
//
// // makeText() 方法需要傳入3個參數。
// // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// // 第二個參數是Toast顯示的文本內容,
// // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
對於新增的category,到AndroidManifest.xml中。SecondActivity配置<intent-filter>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.ActivityTest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
<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>
</application>
</manifest>
更多隱式Intent的用法(啓動其他activity)
使用隱式Intent,我們不僅可以啓動自己程序內的活動,還可以啓動其他程序的活動,這使得Android多個應用程序之間的功能共享成爲了可能。比如說應用程序中需要展示一個網頁,這時沒有必要自己去實現一個瀏覽器(事實上也不太可能),而是隻需要調用系統的瀏覽器來打開這個網頁就行了。
修改FirstActivity中按鈕點擊事件的代碼,如下所示:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
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 {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重寫
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android內部動作)
//構建出intent的“意圖”
intent.setData(Uri.parse("http://www.baidu.com"));
//通過Uri.parse() 方法,將一個網址字符串解析成一個Uri對象,
//再調用Intent的setData() 方法將這個Uri 對象傳遞進去
//setData()接收一個Uri 對象,主要用於指定當前Intent正在操作的數據,
// 而這些數據通常都是以字符串的形式傳入到Uri.parse() 方法中解析產生的
startActivity(intent);//啓動活動
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
// //構建出intent的“意圖”
// intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
// //調用Intent中的addCategory() 方法來添加一個category
//
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //構建出intent的“意圖”
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
// //點擊按鈕時就會執行監聽器中的onClick() 方法。
// @Override //表示重寫
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
// //通過靜態方法makeText() 創建出一個Toast對象
// //並通過show()將Toast顯示出來
//
// // makeText() 方法需要傳入3個參數。
// // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// // 第二個參數是Toast顯示的文本內容,
// // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
一開始會提醒缺少Uri這個量,通過“alt+shift+enter”就可以自動增加import了(不得不感嘆一下,真方便hhh)
運行結果如下圖所示
除此之外,還可以在<intent-filter> 標籤中再配置一個<data> 標籤,用於更精確地指定當前活動能夠響應什麼類型的數據。<data> 標籤中主要可以配置以下內容。
- android:scheme 。用於指定數據的協議部分,如上例中的http部分。
- android:host 。用於指定數據的主機名部分,如上例中的www.baidu.com部分。
- android:port 。用於指定數據的端口部分,一般緊隨在主機名之後。
- android:path 。用於指定主機名和端口之後的部分,如一段網址中跟在域名之後的內容。
- android:mimeType 。用於指定可以處理的數據類型,允許使用通配符的方式進行指定。
只有<data> 標籤中指定的內容和Intent中攜帶的Data完全一致時,當前活動才能夠響應該Intent。不過一般在<data> 標籤中都不會指定過多的內容,如上面瀏覽器示例中,其實只需要指定android:scheme 爲http,就可以響應所有的http協議的Intent了。(甚至不指定也可以正常運行)
構建一個活動能響應Intent
構建一個新的activity,然後編輯third_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_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 3"
/>
</LinearLayout>
ThirdActivity中的代碼保持不變。在AndroidManifest.xml中修改ThirdActivity的註冊信息:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.ActivityTest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.ActivityTest.MY_CATEGORY" />
</intent-filter>
</activity>
<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>
</application>
</manifest>
可以看到,系統自動彈出了一個列表,顯示了目前能夠響應這個Intent的所有程序
選擇瀏覽器會出現之前的百度主頁;選擇ActivityTest,則會啓動ThirdActivity
除了http協議外,我們還可以指定很多其他協議,比如geo表示顯示地理位置、tel表示撥打電話。
修改FirstActivity代碼如下:
package com.example.activitytest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
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 {
//重寫onCreateOptionsMenu方法,將菜單顯示出來
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
//通過getMenuInflater() 方法能夠得到MenuInflater 對象
//再調用它的inflate() 方法就可以給當前活動創建菜單了
//inflate() 方法接收兩個參數,
//第一個參數用於指定我們通過哪一個資源文件來創建菜單,這裏當然傳入R.menu.main 。
//第二個參數用於指定我們的菜單項將添加到哪一個Menu 對象當中,這裏直接使用onCreateOptionsMenu() 方法中傳入的menu 參數。
return true;
//返回true ,表示允許創建的菜單顯示出來
//若返回了false ,創建的菜單將無法顯示。
}
//重寫onOptionsItemSelected方法,定義菜單的相應事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){ //通過調用item.getItemId() 來判斷我們點擊的是哪一個菜單項
case R.id.add_item:
Toast.makeText(FirstActivity.this, "你點了add!",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(FirstActivity.this, "你點了remove!",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
////////////////////////////////////////************************************///////
//定義佈局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);//通過文件名字來調用,加載佈局
//setContentView方法用於加載佈局
//項目中添加的任何資源都會在R文件中生成一個相應的資源id
// 因此,所創建的layout文件會自動將id添加到R文件中
// 只需要調用R.layout.first_layout 就可以得到first_layout.xml 佈局的id
///////////**********************///////////////
Button button1=(Button) findViewById(R.id.button_1);
//通過findViewById() 方法獲取到在佈局文件中定義的元素
//在first_layout文件中,通過android:id="@+id/button_1"定義了按鈕
//findViewById() 方法返回的是一個View 對象,我們需要向下轉型將它轉成Button 對象
button1.setOnClickListener(new View.OnClickListener() {
@Override //表示重寫
public void onClick(View v) {
// Intent intent=new Intent(Intent.ACTION_VIEW);//首先指定了Intent的action 是Intent.ACTION_VIEW(android內部動作)
// //構建出intent的“意圖”
// intent.setData(Uri.parse("http://www.baidu.com"));
// //通過Uri.parse() 方法,將一個網址字符串解析成一個Uri對象,
// //再調用Intent的setData() 方法將這個Uri 對象傳遞進去
// //setData()接收一個Uri 對象,主要用於指定當前Intent正在操作的數據,
// // 而這些數據通常都是以字符串的形式傳入到Uri.parse() 方法中解析產生的
//電話
Intent intent=new Intent(Intent.ACTION_DIAL);//Intent的action 是Intent.ACTION_DIAL
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);//啓動活動
}
});
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent("com.example.ActivityTest.ACTION_START");
// //構建出intent的“意圖”
// intent.addCategory("com.example.ActivityTest.MY_CATEGORY");
// //調用Intent中的addCategory() 方法來添加一個category
//
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// @Override //表示重寫
// public void onClick(View v) {
// Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
// //構建出intent的“意圖”
// startActivity(intent);//啓動活動
// }
// });
// button1.setOnClickListener(new View.OnClickListener() {
// //通過調用setOnClickListener() 方法爲按鈕註冊一個監聽器
// //點擊按鈕時就會執行監聽器中的onClick() 方法。
// @Override //表示重寫
// public void onClick(View v) {
// Toast.makeText(FirstActivity.this, "臭魚!",Toast.LENGTH_SHORT).show();
// //通過靜態方法makeText() 創建出一個Toast對象
// //並通過show()將Toast顯示出來
//
// // makeText() 方法需要傳入3個參數。
// // 第一個參數是Context ,也就是Toast要求的上下文,由於活動本身就是一個Context 對象,因此這裏直接傳入FirstActivity.this 即可。
// // 第二個參數是Toast顯示的文本內容,
// // 第三個參數是Toast顯示的時長,有兩個內置常量可以選擇Toast.LENGTH_SHORT 和Toast.LENGTH_LONG
//
// }
// });
}
}
有: