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

时间: 2024-10-11 05:08:00

Android基础-06的相关文章

Android基础01 快速入门 &amp; 布局

Android基础01 快速入门 & 布局 01.01  手机制式 第一代模拟制式手机(1G):1G就是大哥大,手机类似于简单的无线电双工电台,通话是锁定在一定频率,所以使用可调频电台就可以窃听通话.   第二代GSM.CDMA等数字手机(2G):手机使用PHS,GSM或者CDMA这些十分成熟的标准,具有稳定的通话质量和合适的待机时间,支持彩信业务的GPRS和上网业务的WAP服务,以及各式各样的Java程序等. 第三代移动通信技术(3G):3G,是英文3rd Generation的缩写,指第三代

Android基础-07

Android基础-07 广播与服务 01_为什么需要广播接受者 电台:中央人民广播电台,93.4mhz: 收音机:93.4mhz,收听广播: Android系统内置的电台,发送一些事件:接收短信.外拨电话.电量不足.电量充满.SD插拔.软件安装与下载等. Android应用程序中的收音机:广播接收者,指定需要接收的事件类型: 可以做一些对用户有用的业务逻辑操作. 广播接收者的特点: 1.即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——2.3.12 Date &amp; Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的

Android基础入门教程——2.1 View与ViewGroup的概念

Android基础入门教程--2.1 View与ViewGroup的概念 标签(空格分隔): Android基础入门教程 本节引言: 告别了第一章,迎来第二章--Android中的UI(User Interface)组件的详解, 而本节我们要学习的是所有控件的父类View和ViewGroup类!突发奇想,直接翻译官方文档对 这两个东西的介绍吧,对了,天朝原因,google上不去,Android developer上不去,我们可以 改hosts或者用vpn代理,当然也可以像笔者一样使用国内的API

【C++基础 06】explict关键字

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. 1.示例 我们先来看一段示例代码: class A { public: A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) const {return var == ref.var;}//判等函数 private: int var;//成员变量var }; void main()

2015年最新Android基础入门教程目录(完结版)

2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全套教程 共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享 以及一些疑问等可戳:<2015最新Android基础入门教程>完结散花~ 下面是本系列教程的完整目录: 第一章:环境搭建与开发相关(已完结 10/10) Android基础入门教程--1.1 背景相关与系统架构