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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。