Android基礎-06

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文件和密碼一定要保存號。


資料下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章