创建Activity的步骤
1 新建一个Android工程,起名为ActivityTest 将自动创建一个Activity选项勾选去掉 File-New-Android Application—图1
设置Application Name,PackageName.点击Next-图2
将Create activity选项去掉,如上图,点击Next,Next,Finish
2 在Src文件中创建一个包,起名为com.example.activitytest,此包名与图1中包名一致。
在包下新建一个.class类,起名为Activity01 图3
在src中点击右键,New—Package—图4,
在包设置中,填写包名称,点击Finish。图5
在包上点击右键,New-Class
2 填写Activity名称。点击Finish。
3 在源文件中Activity01继承Activity,并复写onCreate方法(使用Alt+/导航键,使用Source/override method)
在创建好的文件中,使Activity01 extends Activity, 在提示中选择 Import android.app.Activity.
在Activity类中点击右键,选择source—Override/Implement Methods,选择onCreate(Bundle),点击ok.
4 在AndroidManifest.xml文件中注册Activity,并设置为MainActivity。 打开AndroidManifest.xml文件
在<application></application>中添加<activity></activity>
<activity
android:name="com.test.activity.Activity01" android:label="myFirstActivity" > <intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category android:name="android.intent.category.LAUNCHER"></category></intent-filter> </activity>
<intent-filter></intent-filter>过滤器将此Activity设置为首选项。 此时可运行程序,查看Activity的界面,界面空白。
5 在布局文件中设置简单的Button控件、EditText控件、 ViewText控件。 选择res—layout—右键—New Android xml文件
填入File名称—Finish。 在布局文件中添加控件
6 在源文件中使用setContentView函数,引用布局文件资源。 在Activity01.java文件中添加代码
7 在源文件中通过findViewById函数来引用控件,并执行相应的text改变。
8 运行程序,观察效果。
Activity的使用:
(1)通过调用startActivity(intent)启动Activity,intent用来准确的描述你要启动的Activity,或者你要进行的action,intent也可以用来携带小数据给被启动Acitivity。
当在同一个应用中间需要简单启动另一个Activity,intent明确的定义你要启动Activity类即可:
[java] view plain copy
//定义一个intent,指名要启动的activity:ToStartActivity
Intent intent = new Intent(MainActivity.this,ToStartActivity.class)
//使用startActivity(),启动activity
startActivity(intent)
在你的应用程序需要执行一些自身没有Activity可以执行的行为时,我们可以使用手机上的其他应用程序的Activity来代替执行。比如发送一个mail、查看一张图片、搜索一个单词等等。这个里也就是Intent的重要指出,你可以定义一个intent描述你想要做的行为,等你发送给系统后,系统会启动合适的Acitivty帮你执行,如果有多个应用的Activity都可以处理此行为时,系统会让用户去选择一个。
[java] view plain copy
//跨应用从google界面搜索
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH)
intent.putExtra(SearchManager.QUERY, "zy")
startActivity(intent)
当夸应用启动Activity时,在定义intent时必须要为他指定具体的acitvity,前提是此activity必须暴露在自己应用程序之外(android:exported="true"):
[java] view plain copy
Intent intent = new Intent()
//指定要启动组建完整的包名,对象名
ComponentName cn = new ComponentName("com.android.settings",
"com.android.settings.RunningServices")
intent.setComponent(cn)
// 使用context.startActivity()时需要新启一个任务
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
(2)通过调用 startActivityForResult(intent),来接收到启动的Acitivity反馈的结果。为了接收接下来启动的Activity的结果,需要重写onActivityResult()这个回调函数。当调用的activity完成后,它将返回一个含有结果的intent给onActivityResult()处理。比如,在应用程序的Activity中,需要用户选择联系人中的一个,Activity需要得到联系人的部分信息:
[java] view plain copy
Intent intent = new Intent(Intent.ACTION_PICK,
Contacts.People.CONTENT_URI)
//启动一个带有选择联系人返回结果的activity
startActivityForResult(intent, PICK_CONTACT_REQUEST)
这里的PICK_CONTACT_REQUEST为自定义的int型请求反馈结果代码。
[java] view plain copy
//重新onActivityResult()用来处理接收到的返回结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 如果请求requestCode成功,且请求返回的结果resultCode是我们要的PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK
&& requestCode == PICK_CONTACT_REQUEST) {
// 处理Intent返回的数据,在联系人数据库中查找联系人的名字
Cursor cursor = getContentResolver().query(data.getData(),
new String[] { Contacts.People.NAME }, null, null, null)
if (cursor.moveToFirst()) { // 如果cursor不为空,就查找出联系人的名字
int columnIndex = cursor.getColumnIndex(Contacts.People.NAME)
String name = cursor.getString(columnIndex)
//添加其他功能
这里在要说明是onActivityResult()使用来处理返回结果的,首先要检查的是请求是否成功,然后是否有返回结果,结果是否是startActivityForResult()中所要的,如果满足,则处理通过Intent返回的数据。
4.关闭Activity:
(1)Activity可以调用finish()方法关闭自己,也可以通过调用finishActivity()的方法关闭一个独立的之前启动的Activity。
调用finish()方法关闭自己:
[java] view plain copy
//关闭Activity
finish()
(2)调用finishActivity()的方法关闭一个独立的之前启动的Activity
[java] view plain copy
//此方法用在关闭使用startActivityForResult(requestCode)启用的Activity
this.finishActivity(requestCode)
关于何时关闭一个Activity,一般由系统直接为我们管理。但是当你确认用户不用返回到此Activity时,我们调用以上方法关闭对应的Activity。
activity 的优化算是一个重点吧,activity 的启动本来就是挺耗时的,我们需要优化的是那种启动极其耗时的,比如启动新 activity ,会让用户看 1秒多的黑屏,这就不好的了,可能不是所有的朋友的会碰到这个问题,产生这样的 activity 原因时多种多样的,根本原因则是:
不管大家写的怎么样,基本就是这几个原因会造成 activity 启动慢
我们先来看看一个经典的图,activity 和 view 的渲染过程
新界面启动,先执行 activity 3个初始化生命周期函数,执行完之后才会对界面元素 view 执行测量,绘制,渲染,这时我们才能看到实际界面内容,然后还会执行 activity 启动动画
上面的任何任务卡顿都会造成,我们延迟看到页面
对于handle 问题,我们可以用 StallBuster 工具查看页面启动时 handle 系统任务栈的情况,比如下图就是 handle 任务没有清空,影响下个页面启动
所以我们在页面关闭或是不显示时,该关的一定要关
xml 布局层级一定要精简,要不真的非常耗时的,我碰到过自己写的 xml 耗时 1秒多的 ~
这里我们可以用 Hierarchy Viewer 工具 查看 xml 布局效率,用 ConstraintLayout 约束布局 来减少xml 层级,遵照 Android UI性能优化实战 的思路,去掉不必需要的背景,减少过度绘制
activity 的 oncreate 我们一箱习惯写各种初始化 *** 作的,但是很多时候这里面就有耗时 *** 作,所有我们可以 activity 页面渲染完毕再去做这些初始化 *** 作及其后面的获取数据的 *** 作
activity 的延迟 *** 作有2个思路:
这2种写法有区别吗,有,而且很大。系统 UI 线程的所有 *** 作都是通过在 handle 里面添加任务执行的,当我们在谁的初始化时添加 handle 任务,就是表示在谁的渲染之后执行
大家可以看 trace 图
可以明显的看到写法1 的 handle 任务是在 rootviewimpl 渲染 view 之前执行的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)