Activity概述:
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Activity的跳转:
在实现Activity跳转之前,先来创建第二个Activity,写第二布局文件Activity_second.xml,写SecondActivity类继承Activity,在onCreate方法里面加如代码使布局文件显示在界面:setContentView(R.layout.activity_second);
要显示第二个Activity还需要在清单文件中为其配置一个activity标签指定name. 如果activity子节点中有一下代码则代表一个入口activity,则会在系统中多创建一个快捷图标 代码:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
一个应用程序可以在桌面上创建多个图标,activity的名称、图标可以和应用程序的名称、图标不相同 只需在activity中做一下配置
android:icon="@drawable/ic_launcher"指定图标
android:label="@string/app_name" 指定名称
完成第二个Activity之后可以开始做Activity 的跳转,跳转分为隐式跳转和显示跳转。
显示跳转:
显示跳转:跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可
Intent intent = new Intent();
intent.setClass(this, SecondActivity.class);
startActivity(intent);
显示跳转:跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
Intent intent = new Intent();
//启动系统自带的拨号器应用
intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
startActivity(intent);
隐式跳转:使用意图对象的setAction方法指定要跳转的activity
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
startActivity(intent);
如果 要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点
<intent-filter >
<action android:name="com.jiaowoxiaochen.sa2"/> //name的值可以自定义
//action指定动作通过这个name跳转
<data android:scheme="asd" android:mimeType="text/username"/>
//date指定数据 scheme 指定数据格式 mimeType指定数据格式可以自己定义
<category android:name="android.intent.category.DEFAULT"/>
//做一个标记指定类别,一般使用DEFAULT可以不写
</intent-filter>
public void click5View v){
Intent intent = new Intent();
intent.setAction("com.jiaowoxiaochen.sa2"); //和name名匹配
intent.setDataAndType(Uri.parse("asd:123"), "text/username");
startActivity(intent);
}
显示跳转和隐式跳转的应用场景:
显示跳转用于启动同一个应用中的activity。
隐式跳转用于启动不同应用中的activity。
* 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
显示跳转的效率远远大于隐式跳转,显示跳转直接通过包名找到跳转的activity而隐式跳转需要找到所有清单文件并选择匹配的意图过滤标签。
在显示和隐式跳转中如何传递数据:
显示跳转传递数据有两种方式:
方法一直接放入到intent对象中
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("name","马云");
intent.putExtra("sex","男");
startActivity(intent);
方法一在SecondActivity中取出数据的方式
Intent intent = getIntent();
intent.getStringExtra("name");
intent.getStringExtra("sex");
方法二 把数据封装至Bundle对象中,
Intent intent = new Intent(this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name","马云");
bundle.putStirng("sex","男");
intent.putExtras(bundle);
startActivity(intent);
方法二在SecondActivity中取出数据的方式
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name");
String sex = bundle.getString("sex");
隐式跳转传递数据:
隐式跳转也可以使用意图对象传递数据代码同显示跳转传递数据,一般情况下都使用意图对象传递数据。
如果过滤器中指定了data的子节点,那么必要按照data子节点的配置的格式传递数据,不然会找不到指定的过滤器。
//传数据
Intent intent = new Intent( ); intent.setAction("com.itheima.sa2"); intent.setData(Uri.parse("heima2:qwe")); startActivity(intent); //在跳转的activity中取数据
Intent intent = getIntent();
Uri uri = intent.getData();
Activity生命周期:
activity生命周期的各个方法解释
void onCreate() //Activity已经被创建完毕
void onStart()//Activity已经显示在屏幕,但没有得到焦点
void onResume()// Activity得到焦点,可以与用户交互
void onPause()// Activity失去焦点,无法再与用户交互,但依然可见
void onStop()// Activity不可见,进入后台
void onDestroy()//Activity被销毁
void onRestart()//Activity从不可见变成可见时会执行此方法
使用场景
Activity创建时需要初始化资源onCreate(),销毁时需要释放资源onDestroy();或者播放器应用,在界面进入后台时需要自动暂停onStop()
内存不足时:
内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)
Activity的启动模式
Activity任务栈
应用运行过程中,内存中可能会打开多个Activity,那么所有打开的Activity都会被保存在Activity任务栈
栈:后进先出,最先进栈,就会最后出栈
启动模式详解:
标准模式:默认就是这个模式
singleTop:(单一顶部模式)如果目标Activity不在栈顶,那么就会启动一个新的Activity,如果已经在栈顶了,那么就不会再启动了 应用场景:浏览器的书签
singleTask:(单一任务栈,在一个任务栈中只有一个实例存在)如果栈中没有该Activity,那么启动时就会创建一个该Activity,如果栈中已经有该Activity的实例存在了,
那么在启动时,就会杀死在栈中处于该Activity上方的所有Activity,那么此时该Activity就成为了栈顶Activity。应用场景:浏览器的activity,或者一个activity的创建需要占用大量的系统资源。
singleTask的作用:保证整个栈中只有一个该Activity的实例
singleInstance:设为此模式的Activity会有一个自己独立的任务栈,该Activity的实例只会创建一个,保存在独立的任务栈中 应用场景: 电话拨打界面
singleInstance的作用:保证整个系统的内存中只有一个该Activity的实例
设置启动模式的方法:
在清单文件中的activity节点设置 launchMode值
<activity
android:launchMode="singleInstance"
android:name="com.jiaowoxiaochen.lifecycle.SecondActivity"
></activity>
横竖屏切换的生命周期:
默认情况下 ,横竖屏切换, 销毁当前的activity,重新创建一个新的activity。
在一些某些的应用程序常见下,不希望横竖屏切换activity被销毁重新创建,有两种方法:
方法一:让系统的环境 不再去敏感横竖屏的切换。
在清单文件中配置 configChanges的值为orientation|keyboardHidden|screenSize
<activity
android:configChanges="orientation|keyboardHidden|screenSize"
android:name="com.jiaowoxiaochen.life.MainActivity"
android:label="@string/app_name" >
方法二 :写死方向,不允许切换
写习方向同样有两个方法:
第一可以再清单文件中配置
<activity
android:screenOrientation="landscape" // landscape 风景表示横屏 portrait肖像 表示竖屏
android:name="com.jiaowoxiaochen.life.MainActivity"
android:label="@string/app_name" >
第二种用java代码写死
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //ActivityInfo.SCREEN_ORIENTATION_PORTRAIT 竖屏
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE横屏 在activity以创建的时候就写死
简单实现案例:
运用activity的跳转携带数据和跳转返回数据写短信发送器。
主界面如下:
需求:1 点击+按钮 跳转到联系人界面 选择联系人,将联系人的名字返回到联系人输入框中。
2 点击快捷回复,跳转到短信选择界面,选择需要快捷回复的短信内容,将短信内容返回到短信编辑器。
代码:
安卓开发者,产品爱好者
个人微博