android获取跳转页面代码怎么写,Android应用开发-页面跳转与数据传递(重制版)(示例代码)...

Android四大组件:Activity,Service,Broadcast Receiver,Content Provider

创建Activity

定义Java类,继承Activity类

在清单文件中配置activity标签

activity标签下如果带有下面这部分代码,则会在系统中多创建一个快捷图标

一个应用程序可以在桌面创建多个快捷图标。

Activity的名称、图标可以和应用程序的名称、图标不相同

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

Activity的跳转

Activity的跳转需要创建Intent对象,通过设置Intent对象的参数指定要跳转Activity

通过指定Activity实现跳转,称为显式意图

通过指定动作实现跳转,称为隐式意图

显式跳转

跳转至同一应用中的Activity

Intent intent = newIntent();

intent.setClass(this, SecondActivity.class);//指定当前的上下文和目标Activity的字节码

startActivity(intent);

跳转至不同应用中的Activity

Intent intent = newIntent();//指定目标Activity所在的应用的包名和目标Activity的包名加类名,这里启动系统自带的拨号器应用

intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");

startActivity(intent);

隐式跳转

隐式意图跳转至打电话Activity

Intent intent = newIntent();

intent.setAction(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:10086"));

startActivity(intent);

要让一个Activity可以被隐式启动,需要在该应用清单文件下的activity标签下配置intent-filter子标签

系统会在所有应用的清单文件中寻找与我们创建的隐式Intent匹配的intent-filter,找到则启动,找不到则抛异常

匹配就是intent-filter中定义了什么属性,我们创建的intent中也必须设置什么属性

在清单文件的activity标签下,配置intent-filter子标签,其中再配置action和category

应用场景

启动同一应用中的Activity,用显式Intent。显式启动效率明显高于隐式,因为显示直接指定了目标Activity,隐式需要遍历所有应用的清单文件

启动不同应用中的Activity,用隐式Intent。当使用隐式Intent跳转到其他应用中的Activity时,如果系统找到了多个intent-filter与我们创建的Intent匹配,就会弹出对话框,列举所有匹配的Activity,让用户选择。比如我们的手机里如果安装了多款浏览器App,当我们点击一个URL时,会弹出一个对话框让我们选择使用哪个浏览器来打开这个网页,这就是因为跳转到浏览器Activity用的是隐式Intent;有些应用的Activity启动时需要接收数据,比如打电话Activity需要接收电话号码,也只能用隐式Intent

Activity跳转时的数据传递

Activity跳转时,可以把数据封装在Intent中

Intent intent = new Intent(this, SecondActivity.class);

intent.putExtra("name", name);

intent.putExtra("age", age);

startActivity(intent);

Intent中可以封装的数据类型:八大基本数据类型和字符串以及它们的数组,还有实现了序列化接口的对象,还有Bundle对象。数据也可以先封装至Bundle,再把Bundle封装至Intent

在跳转到的目标Activity中取出数据

Intent intent = getIntent(); //获取启动该Activity的Intent

String name = intent.getStringExtra("name");int age = intent.getIntExtra("age");

Activity的生命周期

2522d35621524fda18a6bb49f7027efa.png

onCreate():创建Activity时被回调

onStart():在屏幕上可见,但是还没有获得焦点

onResume():可见并且获得焦点

onPause():可见,但是失去焦点

onStop():不可见

onDestroy():销毁时调用

onRestart():Activity从不可见变为可见时调用

按返回键,系统依次回调onPause()、onStop()、onDestroy(),Activity被销毁,进程还在;若再次进入该Activity,系统会依次回调onCreate()、onStart()、onResume(),Activity重新进入运行状态

按返回键,Android系统会回调onBackPressed()方法,该方法调用了finish(),所以Activity会被销毁

按Home键,系统依次回调onPause()、onStop(),Activity进入停止状态,进程还在;若再次进入该Activity,系统会依次回调onRestart()、onStart()、onResume(),Activity重新进入运行状态

手机内存不足时,会杀死之前启动的进程,按照LRU(最近最少使用)算法锁定杀死哪个进程

Activity的四种启动模式

每个应用有一个Activity Task栈,存放已启动的Activity。Activity的启动模式决定了Task栈的操作规则

standard:默认就是标准模式,每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity实例添加到Task栈中

singleTop:Task栈顶单例模式,与标准模式仅有一点不同:当要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例

应用:浏览器书签历史记录界面CombinedBookmarkHistoryActivity

应用:短信会话记录界面ConversationList

singleTask:Task栈内单例模式,采用这种启动模式的Activity在同一个Task栈内只能有一个实例。如果Activity没有被创建任何实例,那么启动时会创建并入栈;如果已经被创建了一个实例,那么启动时会返回(退栈)至该Activity

应用:浏览器浏览界面BrowserActivity

singleInstance:全局单例模式,采用这种启动模式的Activity在整个Android系统内存中只能有一个实例。如果将要启动的目标Activity不存在,系统会先创建一个全新的Task栈,再创建目标Activity的实例,并将他压入新的Task栈顶;如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中、位于哪个Task栈中,系统都会把该Activity所在的Task栈转到前台,从而使该Activity显示出来。需要指出的是,采用singleInstance模式启动的Activity总是位于Task栈顶,且该Task栈中只有该Activity

应用:来电界面InCallScreen

Activity的横竖屏切换

默认情况横竖屏切换会使Activity销毁重建,触发生命周期方法重新执行

在一些特殊的应用程序中,比如游戏,不希望横竖屏切换导致Activity被销毁重建,如果不保存会丢失游戏数据

在清单文件中用以下代码让横竖屏切换时不重建Activity

android:configChanges="orientation|screenSize|keyboardHidden"

在清单文件中可用以下代码写死Activity的屏幕方向

android:screenOrientation="portrait" android:screenOrientation="landscape"

在java文件中可用以下代码写死Activity的屏幕方向(会覆盖清单文件中的设置)

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //横屏

Activity销毁时返回数据

步骤:

指定请求码requestCode启动新的Activity

startActivityForResult(intent, requestCode);

在新的Activity中设置要返回的数据

Intent data = newIntent();

data.putExtra("tel", tel);

setResult(resultCode, data);//指定一个结果码resultCode,并把数据会返回给原Activity

finish();

在原Activity里面实现方法

//通过data获取返回的数据

onActivityResult(int requestCode, intresultCode, Intent data) {

}

通过判断请求码和结果码确定返回值data的作用

先通过请求码requestCode判断返回的data来自哪个Activity

再通过该Activity返回的结果码resultCode判断data中是该Activity所返回的哪一个数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值