本帖最后由 小鲁哥哥 于 2016-11-28 17:00 编辑
【济南中心】Android课程同步笔记day06:Android应用开发基础 Activity简介:
在Android中一个Activity对应一个界面。
Activity在创建使用:
创建一个类继承Activity,在onCreate方法中通过setcontentView(R.layout.xxx)方法设置该界面的布局文件
[Java] 纯文本查看 复制代码 public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
} 在清单文件AndroidManifest.xml的application节点中配置该Activity [XML] 纯文本查看 复制代码 <activity
android:name="com.itheima.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>
Activity之间的跳转:
显示意图:必须要指定被开启的Activity的类名或者路径名,跳转自己应用程序内部的组件,推荐使用显式意图,效率高
第一种:
[Java] 纯文本查看 复制代码 Intent intent = new Intent();//意图对象
intent.setClass(this, SecondActivity.class); //第一个参数需要传入一个Context对象,this表示当前Activity,第二个参数是要跳转到的界面
startActivity(intent);//开启意图,让意图对象做事
第二种:
[Java] 纯文本查看 复制代码 Intent intent = new Intent();
intent.setClassName("com.itheima.twointent", "com.itheima.twointent.Activity01");
startActivity(intent);
隐式意图:需要指定action(动作) 和 data (数据),跳转其他的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用,效率低
[Java] 纯文本查看 复制代码 Intent intent = new Intent();
intent.setAction("com.itheima.twointent.OPEN02");//设置动作
intent.addCategory("android.intent.category.DEFAULT");//设置类别
startActivity(intent);
下面举两个隐式意图开启界面的例子:
1.打开浏览器
[Java] 纯文本查看 复制代码 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.itheima.com"));
startActivity(intent);
2.打开发送短信的界面
[Java] 纯文本查看 复制代码 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","发送短信");
startActivity(intent);
1. Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
2. setData()和setType()要一起使用时,要使用setDataAndType()方法
设置Activity没有标题栏
1.在清单文件中配置单个activity节点的主题
[XML] 纯文本查看 复制代码 <activity
android:theme="@android:style/Theme.Light.NoTitleBar"
android:name="com.itheima.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>
2.在清单文件中配置整个application节点的主题,在此配置后,该应用所有界面都没有标题栏
[XML] 纯文本查看 复制代码 <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 跳转时传递数据
第一种情况:A跳转B,B获取A携带的数据
[Java] 纯文本查看 复制代码 A界面,传递数据
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);
B界面,接收数据
//获取传递过来的数据
Intent intent = getIntent();
intent.getXXXExtra();
第二种情况:A跳转B,当B界面关闭的时候,A获取B传过来的数据
[Java] 纯文本查看 复制代码 1.A调用startActivityForResult
Intent intent = new Intent(this, ContactListActivity.class);
startActivityForResult(intent, 2);
2.B界面设置数据
//把当前界面的数据,返回给开启我的界面.
Intent data = new Intent();
data.putExtra("message", message);
setResult(0, data);
//把当前界面关闭
finish();
3.返回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");
mTextView.setText(message);
}
} else if (requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
}
请求码与结果码
请求码:如果A中多次调用startActivityForResult(),从其他界面获取数据,可以使用请求码进行区分
结果码:B中可以设置结果码,来通知A返回结果是否成功等信息
Activity的生命周期
对象从创建到被垃圾回收过程中一定会执行的方法就叫做生命周期方法.
1. onCreate 被创建
2. onDestroy 被销毁
3. onStart 可见
4. onStop 不可见
5. onResume 获取焦点
6. onPause 失去焦点
7. onRestart 界面不可见之后,再次回到该界面
|
横竖屏切换
1.指定屏幕朝向
在清单文件对应的Activity中配置android:screenOrientation=”landscape”(横屏,portrait是竖屏);
2.设置屏幕旋转时不重新创建Activity
在清单文件对应的Activity中配置android:configChanges="keyboardHidden|orientation|screenSize",最好这三个都配置,否则不能适配所有机型或sdk版本。
横竖屏切换时会走Activity的onConfigurationChanged()方法
[Java] 纯文本查看 复制代码
@Override
public void onConfigurationChanged(Configuration newConfig) {
// 当新设置中,屏幕布局模式为横排时
if(newConfig.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
//TODO 某些操作
}else{
//TODO 某些操作
}
super.onConfigurationChanged(newConfig);
} 任务栈 task: 一个应用程序一般包括多个Activity,每个Activity都是用来处理用户交互的一个任务 stack: 栈,是一总特殊的数据结构(后进先出)。队列要是一种特殊的数据结构(先进先出) standard : 标准的启动模式默认应用场景 singleTop : 单一顶部模式 如果Activity已经被开启,并且处于任务栈的栈顶,就不会创建新的Activity,而是复用这个已经开启的Activity. 为了防止出现一些奇怪的用户体验.推荐使用单一顶部模式.整个任务栈可以有多个实例存在. singletask: 单一任务栈 在整个任务栈里面只允许有一个当前Activity的实例存在. 如果要开启的Activity在任务栈中已经存在,直接复用这个已经存在的Activity,并且把这个Activity上面的所有的其他Activity给清空. singleInstance :单一实例 整个手机操作系统只有一个实例存在,并且是运行在自己单独的任务栈里面 如果要改变一个Activity的启动模式可以在Manifest中进行更改 [XML] 纯文本查看 复制代码 <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...
...
<activity android:name="com.itheima.launchmode.SecondActivity"
//配置android:launchMode属性
android:launchMode="singleTop" >
</activity>
</application>
|