1.Android中开发一个界面的过程
- 界面在Android中对应的类为Activity
-
创建一个类继承Activity,在onCreate方法中通过setcontentView(R.layout.xxx)方法设置该界面的布局文件
public class MainActivity extends Activity {@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
} -
在清单文件AndroidManifest.xml的application节点中配置该Activity
<activity
android:name="com.mythmayor.mutliuiapp.MainActivity" //配置类的全类名,必须配置
android:label="@string/app_name" > //标题栏上显示的文字,可以不配置
//应用程序的启动页面必须配置如下intent-filter节点,action和category缺一不可
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2.如何进行界面的跳转
//第一种
Intent intent = new Intent();//意图对象
intent.setClass(this, SecondActivity.class); //SecondActivity.class 要跳转到的界面
startActivity(intent);
//第二种
Intent intent = new Intent(Context context, Class
3.如何设置Activity没有标题栏
-
在清单文件中配置单个activity节点的主题
<activity
android:theme="@android:style/Theme.Light.NoTitleBar"
android:name="com.mythmayor.rpcalc.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> -
在清单文件中配置整个application节点的主题,在此配置后,该应用所有界面都没有标题栏
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
//1.找到主题对应的style文件,按住ctrl键用鼠标左键点击即可
android:theme="@style/AppTheme" >
...
...
</application>
//2.在对应的style文件中添加对应的条目
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
</style> -
在Activity的onCreate中设置
requestWindowFeature(Window.FEATURE_NO_TITLE);
4.如何关闭一个Activity
调用finish()方法
5.2秒后跳入新界面怎么做
//注意,不要在主线程(UI线程)中使用Thread.sleep()方法,会让界面卡住
new Thread(){
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent intent = new Intent();
intent.setClass(MainActivity.this, CalcActivity.class);
startActivity(intent);
finish();//把mainActivity关闭
};
}.start();
6.Activity 跳转时如何传递数据
第一个界面,传递数据
Intent intent = new Intent(this, ResultActivity.class);
//添加要传递的数据,可传递的数据类型有:
//1. 8个基本数据类型及其数组:byte、short、int、long、float、double、boolean、char及他们的数组
//2. 字符串及其数组:CharSequence及其数组、String及其数组
//3. 集合:CharSequence的ArrayList、String的ArrayList、Integer的ArrayList
//4. 对象:Serializable、Parcelable及其数组、继承自Parcelable的ArrayList
intent.putExtra(key,value);
startActivity(intent);
第二个界面,接收数据
//获取传递过来的数据
Intent intent = getIntent();
intent.getXXXExtra();
7.显式意图&隐式意图
-
显式意图,必须要指定被开启的Activity的类名或者路径名。激活自己应用程序内部的组件,推荐使用显式意图,效率高
Intent intent = new Intent();
intent.setClassName("com.mythmayor.twointent", "com.mythmayor.twointent.Activity01");
startActivity(intent); -
隐式意图,只需要指定action(动作) 和 data (数据)就可以了。一般用来激活别的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用,效率低.
Intent intent = new Intent();
intent.setAction("com.mythmayor.twointent.OPEN02");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);-
Activity若想被隐式意图激活,需要配置意图过滤器
<activity android:name="com.mythmayor.twointent.Activity02">
<intent-filter >
<action android:name="com.mythmayor.twointent.OPEN02"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
-
8.隐式意图的详细参数
- Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
- setData()和setType()要一起使用时,要使用setDataAndType()方法
9.打开浏览器的隐式意图
// 浏览器的Activity中配置的隐式意图
// <intent-filter>
// <action android:name="android.intent.action.VIEW" />
// <category android:name="android.intent.category.DEFAULT" />
// <category android:name="android.intent.category.BROWSABLE" />
// <data android:scheme="http" />
// <data android:scheme="https" />
// <data android:scheme="about" />
// <data android:scheme="javascript" />
// </intent-filter>
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("http://www.mythmayor.com"));
startActivity(intent);
10.发送短信界面的隐式意图
// 发送短信的Activity中配置的隐式意图
// <intent-filter>
// <action android:name="android.intent.action.VIEW" />
// <action android:name="android.intent.action.SENDTO" />
// <category android:name="android.intent.category.DEFAULT" />
// <category android:name="android.intent.category.BROWSABLE" />
// <data android:scheme="sms" />
// <data android:scheme="smsto" />
// </intent-filter>
Intent intent = new Intent();
intent.setAction("android.intent.action.SENDTO");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("smsto:"));
intent.putExtra("sms_body",
"推荐你使用一款软件,名字叫人品计算器,我测试出来的结果好准确呀,下载地址,http://bbs.mythmayor.com");
startActivity(intent);
11.打开系统应用某个界面的思路
- 找到该应用源码
- 在logcat中查看该界面是哪个Activity
- 在源码的清单文件中查找该Activity,查看其隐式意图
- 利用隐式意图激活该Activity
12.ListView条目的点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
//当listview的条目被点击的时候调用的方法
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//parent:该ListView
//view:该行的View
//position:点击的是第几行,从0开始
}
});
13.开启另一个Activity获取数据的步骤
- 前提:A开启B,想从B获取数据
-
A调用startActivityForResult
Intent intent = new Intent(this, ContactListActivity.class);
startActivityForResult(intent, 2); -
B界面设置数据
//把当前界面的数据,返回给开启我的界面.
Intent data = new Intent();
data.putExtra("message", message);
setResult(0, data);
//把当前界面关闭
finish(); -
返回A界面,系统会调用onActivityResult()方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
}
14.请求码与结果码
- 请求码:如果A中多次调用startActivityForResult(),从其他界面获取数据,可以使用请求码进行区分
- 结果码:B中可以设置结果码,来通知A返回结果是否成功或其他信息
15.Activity的生命周期
对象从创建到被垃圾回收过程中一定会执行的方法就叫做生命周期方法.
- onCreate 被创建
onDestroy 被销毁
onStart 可见
onStop 不可见
onResume 获取焦点
onPause 失去焦点
onRestart 界面不可见之后,再次回到该界面
16.生命周期的重要概念
-
entire lifetime
完整生命周期
oncreate–onstart–onresume–onpause–onstop–ondestroy -
visible lifetime
可视生命周期
onstart—>onresume—onpause—-ondestroy -
foreground lifetime
前台生命周期
onresume —> onpause
17.如何处理横竖屏切换
- 指定屏幕朝向
在清单文件对应的Activity中配置android:screenOrientation=”landscape”(横屏,portrait是竖屏); -
设置屏幕旋转时不重新创建Activity
在清单文件对应的Activity中配置android:configChanges=”keyboardHidden|orientation|screenSize”,最好这三个都配置,否则不能适配所有机型或sdk版本。
横竖屏切换时会走Activity的onConfigurationChanged()方法@Override
public void onConfigurationChanged(Configuration newConfig) {
// 当新设置中,屏幕布局模式为横排时
if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
//TODO 某些操作
}else{
//TODO 某些操作
}
super.onConfigurationChanged(newConfig);
}
18.任务栈
task stack
task: 一个应用程序一般包括多个Activity,每个Activity都是用来处理用户交互的一个任务
stack: 栈,是一种特殊的数据结构(后进先出)。队列要是一种特殊的数据结构(先进先出)
任务栈就是用来记录用户的操作的,记录的是Activity打开的先后顺序,后打开的界面先关闭,如果整个任务栈里面打开的Activity都被关闭了,就是应用程序被退出了.
一个应用程序一般只有一个任务栈,但是也可能对应有多个任务栈
19.Activity的启动模式
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...
...
<activity android:name="com.mythmayor.launchmode.SecondActivity"
//配置android:launchMode属性
android:launchMode="singleTop" >
</activity>
</application>
-
standard:标准的启动模式
- 默认应用场景
- 默认应用场景
-
singleTop:单一顶部模式
- 如果Activity已经被开启,并且处于任务栈的栈顶,就不会创建新的Activity,而是复用这个已经开启的Activity。
- 为了防止出现一些奇怪的用户体验,推荐使用单一顶部模式,整个任务栈可以有多个实例存在.
- 应用场景:短信发送界面.
-
singletask:单一任务栈
- 在整个任务栈里面只允许有一个当前Activity的实例存在
- 如果要开启的Activity在任务栈中已经存在,直接复用这个已经存在的Activity,并且把这个Activity上面的所有的其他Activity给清空
- 应用场景:如果一个Activity非常消耗内存和cpu资源,建议把这个Activity做成singletask的模式。浏览器的browserActivity
-
singleinstance:单一实例.
- 整个手机操作系统只有一个实例存在,并且是运行在自己单独的任务栈里面.
- 应用场景:通话界面的Activity
20.总结
- Activity的创建
- Activity的跳转
- Activity跳转时传递数据
- 显示意图和隐式意图
- 开启新的Activity并获取返回值startActivityForResult
- Activity的生命周期
- Activity横竖屏切换的生命周期
- Activity的任务栈
- Activity的四种启动模式