Android基礎-06 Activity頁面跳轉和數據傳遞
01_AndroidManifest文件中的幾個細節
在Android應用程序中一個activity就對應了一個界面。
結論:
1、一個應用程序可以有多個桌面圖標;
2、創建快捷圖標的方法:
<intent-filter>
//main 應用程序的入口
<action android:name="android.intent.action.MAIN" />
//LAUNCHER 啓動器
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
3、activity節點中label的值就是桌面圖標的名稱;
4、activity節點中label的值就是界面標題的(值)名稱;
5、應用程序的名稱可以在應用程序的管理列表中看到,application節點中的label標籤和activity中的label標籤不是一個概念,application節點中的label標籤表示應用程序的名稱。
02_意圖設置動作激活新的界面(重點)
從第一個界面跳轉到第二個界面:
Intent意圖:做一件事情的想法;
Intent意圖的作用:激活組件和攜帶參數;
意圖包含要素:
動作、數據;
喫飯:動作、數據
打人:動作、數據
泡茶:
泡妞:動作、數據
模版代碼:
//創建一個開啓第二個界面的意圖
Intent intent = new Intent();
//設置目標activity的動作
intent.setAction("com.itheima..multiview.SECONDSHOW");
//設置目標activity的數據
intent.setData(Uri.parse("itheima://110"));
//設置目標activity的類型
intent.addCategory("android.intent.category.DEFAULT");
//開啓一個新的界面
startActivity(intent);
03_意圖設計的目的
意圖設計的目的:解耦;
解耦:要求寫的代碼模塊或者方法能夠獨立運行和彼此相互調用;
架構師、構架師:多快好省的完成一個項目;
代碼:
private WebView wv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到瀏覽器對象
wv = (WebView) findViewById(R.id.wv);
//設置瀏覽器不緩存數據
WebSettings settings = wv.getSettings();
settings.setAppCacheEnabled(false);
//得到其他組件或應用程序傳遞過來的intent對象
Intent intent = getIntent();
Uri uri = intent.getData();
if(uri != null){
//得到其他應用程序傳遞過來的url地址
String url = uri.toString();
//使用瀏覽器打開一個頁面
wv.loadUrl(url);
}
}
04_隱式意圖和顯式意圖(重點)
1、隱式意圖:
在開啓目標activity時,不需要直接指定目標activity的名稱,通過指定一組動作、數據、類型等屬性,讓系統從清單文件中匹配指定的acitivity來開啓activity。
模版代碼:
//創建一個開啓第二個界面的意圖
Intent intent = new Intent();
//設置目標activity的動作
intent.setAction("com.itheima..multiview.SECONDSHOW");
//設置目標activity的數據
intent.setData(Uri.parse("itheima://110"));
//設置目標activity的類型
intent.addCategory("android.intent.category.DEFAULT");
應用場景:開啓其他應用程序中的組件時使用隱式意圖;
2、顯式意圖:
在開啓目標activity時需要直接指定目標activity名稱;
模版代碼:
//創建一個顯示意圖開啓第二個界面
Intent intent = new Intent(this, SecondActivity.class);
//開啓一個新的界面
startActivity(intent);
應用場景:開啓應用程序內部的activity;
05_意圖傳遞數據(重點)
從第一個界面傳遞一些數據給第二個界面,在第二個界面上顯示出來;
intent可以傳遞的數據類型:
八大基本類型及其數據:
parcelable
Serializable
Bundle
putExtras(Bundle);
代碼:
傳遞數據:
//創建一個顯示意圖開啓第二個界面
Intent intent = new Intent(this, SecondActivity.class);
//把需要提交的數據封裝到意圖對象中
// intent.putExtra("name", "itheima");
// intent.putExtra("age", 4);
//
Bundle b = new Bundle();
b.putString("name", "itheima");
b.putInt("age", 4);
intent.putExtra("info", b);
//開啓一個新的界面
startActivity(intent);
接收數據:
Intent intent = getIntent();
//
// String name = intent.getStringExtra("name");
// int age = intent.getIntExtra("age", 0);
Bundle b = intent.getBundleExtra("info");
String name = b.getString("name");
int age = b.getInt("age");
tv.setText("name:"+name+";age:"+age);
06_URI介紹
url: http://www.baidu.com/image/1.jpg
URI的組成部分:
1、scheme:協議的名稱,content,tel;
2、主機名:
3、路徑:
4、訪問的資源數據:
07_開啓activity獲取返回值(重點)
從第一個界面跳轉到第二個界面上,當第二個界面關閉的時候給第一個界面返回一些數據,在第一個界面顯示返回的數據。
1、從第一個界面跳轉到第二個界面上,期待第二個界面返回數據;
2、在第二個界面關閉之前設置返回的數據,當第二個界面關閉時返回數據:
3、在第一個界面顯示返回的數據:
MainActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* 在avtivity實例一創建的時候就會調用這個方法
* 初始化avtivity實例
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加載界面的佈局文件
setContentView(R.layout.activity_main);
}
public void jump(View view){
//創建一個顯示意圖開啓第二個界面
Intent intent = new Intent(this, SecondActivity.class);
//開啓一個新的界面,期待目標activity返回數據
// startActivity(intent);
startActivityForResult(intent, 0);
}
//接收目標activity返回的數據
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String info = data.getStringExtra("info");
Toast.makeText(this, info, 0).show();
}
}
SecondActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加載界面的佈局文件
setContentView(R.layout.activity_second);
tv = (TextView) findViewById(R.id.tv);
}
public void return01(View view){
//設置返回的數據,
Intent data = new Intent();
data.putExtra("info", "我是從第二個界面返回的數據");
//當界面關閉時調用這個方法生效
setResult(100, data);
//關閉當前界面
finish();
}
}
08_請求碼和結果碼的作用(重點)
請求碼和結果碼的作用:用來當前數據是從哪個業務邏輯界面返回的。
代碼:
MainActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* 在avtivity實例一創建的時候就會調用這個方法
* 初始化avtivity實例
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加載界面的佈局文件
setContentView(R.layout.activity_main);
}
public void jump(View view){
//創建一個顯示意圖開啓第二個界面
Intent intent = new Intent(this, SecondActivity.class);
//開啓一個新的界面,期待目標activity返回數據,設置了請求碼
// startActivity(intent);
startActivityForResult(intent, 0);
}
public void jump02(View view){
//創建一個顯示意圖開啓第二個界面
Intent intent = new Intent(this, ThirdActivity.class);
//開啓一個新的界面,期待目標activity返回數據,設置了請求碼
// startActivity(intent);
startActivityForResult(intent, 1);
}
//接收目標activity返回的數據
//requestCode 請求碼,是在開啓目標activity時設置的
//resultCode 結果碼 ,是在目標activity設置返回數據時設置的
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// switch (requestCode) {
// case 0:
// String info = data.getStringExtra("info");
// Toast.makeText(this,"從第二個界面返回的數據是:"+ info, 0).show();
// break;
// case 1:
//
// String info1 = data.getStringExtra("info");
// Toast.makeText(this,"從第三個界面返回的數據是:"+ info1, 0).show();
// break;
// }
switch (resultCode) {
case 100:
String info = data.getStringExtra("info");
Toast.makeText(this,"從第二個界面返回的數據是:"+ info, 0).show();
break;
case 300:
String info1 = data.getStringExtra("info");
Toast.makeText(this,"從第三個界面返回的數據是:"+ info1, 0).show();
break;
}
}
}
SecondActivity.java:
package com.itheima.multiview;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class SecondActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加載界面的佈局文件
setContentView(R.layout.activity_second);
tv = (TextView) findViewById(R.id.tv);
}
public void return01(View view){
//設置返回的數據,
Intent data = new Intent();
data.putExtra("info", "我是從第二個界面返回的數據");
//當界面關閉時調用這個方法生效
setResult(100, data);
//關閉當前界面
finish();
}
}
09_activity的生命週期(重點)
生命週期:在生命的整個期間,經歷一些階段,在每個界面都會調用的相應的方法(方法的回調)。
暗戀、初戀、熱戀、癡戀、失戀;
onCreate:初始化;
onStart:開始activity,界面可見時調用這個方法;
onResume:獲得界面焦點;
onPause:失去界面焦點;
onStop:界面不可見;
onRestart:重新開始打開一個界面;
onDestroy:在銷燬實例對象之前調用這個方法;
10_讀文檔查看activity的生命週期
整體生命週期:onCreate、onStart、onResume、onPause、onStop、onDestroy;
可視化的生命週期:onStart、onResume、onPause、onStop;
前置生命週期:onResume、onPause;
11_橫豎屏切換的生命週期(重點)
橫豎屏切換的生命週期:先關閉前面一個界面,打開一個新的界面;
1、設置屏幕的方向:設置screenOrientation="landscape",landscape橫屏、portrait豎屏、sensor傳感器類型(自適應);
2、設置切換屏幕方向時不調用生命週期的方法:configChanges="orientation|screenSize|keyboardHidden";
12_任務棧的概念
隊列:先進先出;
棧:先進後出;
任務:activity的實例對象。
任務棧:用於存放任務的棧;
打開一個界面,在任務棧中存放對應的一個任務;關閉一個界面的時候,從任務棧中清除對應的任務;
當任務棧中的任務被 清除完了,表示應用程序退出了。
13_啓動模式:
standard:標準模式,沒打開一個界面都會創建一個實例放入任務棧中;
singleTop:單一頂部模式;
singletop啓動模式
singletop 單一頂部模式 在activity的配置文件中設置android:launchMode="singleTop"
如果任務棧的棧頂存在這個要開啓的activity,不會重新的創建activity,而是複用已經存在的activity。保證棧頂如果存在,不會重複創建。
應用場景:瀏覽器的書籤
singletask和singleinstance啓動模式
singetask 單一任務棧,在當前任務棧裏面只能有一個實例存在;
當開啓activity的時候,就去檢查在任務棧裏面是否有實例已經存在,如果有實例存在就複用這個已經存在的activity,並且把這個activity上面的所有的別的activity都清空,複用這個已經存在的activity。保證整個任務棧裏面只有一個任務存在。
應用場景:瀏覽器的activity
如果一個activity的創建需要佔用大量的系統資源(cpu,內存)一般配置這個activity爲singletask的啓動模式。webkit內核 c代碼
singleInstance啓動模式非常特殊, activity會運行在自己的任務棧裏面,並且這個任務棧裏面只有一個實例存在
如果你要保證一個activity在整個手機操作系統裏面只有一個實例存在,使用singleInstance
應用場景: 電話撥打界面
15_應用程序簽名打包
把應用程序的代碼打包成apk;
給應用程序打包時使用簽名的原因: 避免覆蓋安裝(如果應用程序的包名相同就會出現覆蓋安裝的情況;
keystore文件和密碼一定要保存號。