您的位置:首页 > 移动开发 > Android开发

Android基础-06

2015-04-03 11:44 92 查看

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

资料下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: