多个界面应用程序开发
- 在清单文件中配置
- 在代码中实现onCreate()-->setContentView();
- 一个程序可以有多个界面,在桌面上可以有多个快捷图标.
清单文件中配置以下内容,即有多个启动入口
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
界面跳转
Intent 可以用于activity传递数据
- 传递页面:MainActivity
Intent intent = new Intent(MainActivity.this, Main2Activity.class); //传递数据 //string类型的 intent.putExtra("string", textView.getText().toString()); //图片类型的 intent.putExtra("image", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); startActivity(intent);
- 接受数据页面 Main2Activity
//得到传递的数据 Intent intent = getIntent(); //接受字符串 String text = intent.getStringExtra("string"); //接受图片 Bitmap image = intent.getParcelableExtra("image"); textView.setText(text); imageView.setImageBitmap(image);
显式意图 & 隐式意图
- 显式意图
必须要指定被开启的Activity的类名或者路径名称 激活自己应用程序的内部组建,推荐使用显式意图,效率高
- 开启自己应用程序内的页面
Intent intent = new Intent(MainActivity.this, Main1Activity.class); startActivity(intent);
- 隐式意图
只需要指定action(动作)和data(数据)就可以 激活别的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用.效率低.
- 开启自己应用程序内的页面(实际开发并不会这样使用,只是用于对比代码写出)
Intent intent = new Intent(); intent.setAction("com.example.yuewang.basicandroidday06.open2"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent);
- 开启外部应用程序内的页面
Intent intent = new Intent();
//action的内容与下面在清单文件中配置的相同
intent.setAction("com.example.myapplication.Main3Activity");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
还需要在(Main3Activity)清单文件中配置
<activity android:name=".Main3Activity">
<intent-filter>
<action android:name="com.example.myapplication.Main3Activity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
隐式意图的详细参数
intent.setType();和intent.setData();不能同时是使用,因为任意一个会清除前面一个设置的属性值,因此要想同事设置这两个值,可以使用setDataAndType()设置!
- 需要注意的细节
- 当隐式意图配置了多个data标签的时候,代码编写的时候至少要配置一个!,如果多配置了,最后的会覆盖前面的
- 如果别人的隐式activity有多个Category的时候,尽量都写全,不要漏写
- 记住在清单文件中配置隐式activity的时候,一定要配置默认的category( <category android:name="android.intent.category.DEFAULT"/> ) 因为在代码中,就算不显示的去调用addCategory(),系统也会默认的给我们加上一个DEFALUT值的category,这个时候如果要打开的activity清单 文件中没有配置默认的category就会出错了!
- 发现隐式意图有多个action的时候,只需要配置一个就可以了。
使用Intent传递数据
三步:
- 告诉即将要打开的页面,你需要你返回的数据 --startActivityForResult(intent, 1);
- 使用setResult()返回请求的数据,并且设置对应的key --setResult(2, intent);
- 接受返回的数据 --onActivityResult
- 具体代码:
//1.告诉即将要打开的页面,你需要你返回的数据 Intent intent = new Intent(this, SmsListActivity.class); startActivityForResult(intent, 1);
//2.使用setResult()返回请求的数据,并且设置对应的key Intent intent = new Intent(); String contact = ContactListActivity.this.contact[position]; intent.putExtra("contact", contact); setResult(2, intent); finish();
//3.接受返回的数据 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //3.接受返回的数据,通过设置的resultCode区分是谁返回的数据 if (requestCode == 1) { if (data != null) { String messageText = data.getStringExtra("message"); content.setText(messageText); } } else if (requestCode == 2) { if (data != null) { String contactText = data.getStringExtra("contact"); contact.setText(contactText); } } }
Activity的生命周期
onCreate()-->(onRestart())-->onStart()-->onResume()-->onPause()-->onStop()-->onDestory().
onCreate()--Activity创建时调用的方法
onDestory()--Activity销毁时调用的方法
onStart()--Activity页面可见时调用的方法
onStop()--Activity页面不可见时调用的方法
onResume()--Activity页面获取焦点时调用的方法
(案例中是在页面上开启一个透明的activity
时,之前的页面虽然可见,但是失去焦点了.可以在清单文件中设置主题
android:theme="@android:style/Theme.Translucent.NoTitleBar")
onPause()--Activity页面失去焦点时调用的方法
onRestart()--onStop()到onstart()时之前经历的一个方法
- 横竖屏切换时的生命周期
横竖屏切换时默认回销毁当前activity,然后在重新开启,因此可以设置以下属性,这样activiy就不会因为切换横竖屏而销毁activity.
//设置屏幕的固定朝向 android:screenOrientation="landscape"(或者portrait) //或者设置屏幕变化属性 android:configChanges="keyboardHidden|screenSize|orientation"
Activity的启动模式(android:launchMode="")
-
standard:标准启动模式
默认场景,每次都会开启新的activity
-
singleTop:单一顶部模式
如果activity已经开启,且位于栈顶,则不会开启新的activity,而是复用这个已经开启的activity,为了方式出现一些奇怪的用户体验,推荐使用这个模式,整个任务栈中可以允许有多个实例存在,只是检查栈顶是否是当前实例.
应用场景:短信发送
-
singleTask:单一任务栈
在整个任务战中之允许有一个当前的activity存在,如果要开启的activity已经存在,那么直接复用已经开启的,并且会把这个栈上当前activity上面其他的activity给清空.
应用场景:如果一个activity非常消耗内存建议把这个activity设置成singleTask模式. 浏览器
-
singleInstant:单一实例
整个手机系统中只有一个实例存在,且运行在单独的任务栈里面.
应用场景:通话界面的activity