第一章 Activity
手动创建自己的 Activity。
右键包,选择 NEW-Activiry-empty Activity。
不要勾选 Generate Layout File(自动创建布局文件)与 Luncher Activity (将此活动作为项目的 主活动 )。手动创建Activity 的 layout 文件。
右击 res/layout 选择 layout source File ,创建。
在 XML 文件中,引用 id ,需要用到 @id/button_1,
注册 id , 需要用到 @ +id/button_1。
然后在Activity 文件中,调用 setContentView(R.layout.first_layout) 使用布局文件。在AndroidManifest 文件中注册。
活动的声明放在 <application> 标签内,通过 <activity> 标签来进行活动注册。
在 <activity> 中,name -> 指定注册哪一个活动,name 的属性为 .TestMyActivity 表示的是
com.tad.test.TestMyActivity 。 因为最外层的 package属性指定了包名,因此这里可以省略。
在 <activity> 标签内部添加标签 <intent-filter> 并在标签内添加
<action android:name = "andriod.intent.action.MAIN",声明主活动。
<category android:name = "android.intent.category.LUNCHER"。
还可以用android:label 指定标题栏内容。在活动使用 Toast 。
使用 Toast 的 makeText() 方法,创建 Toast 对象,并用 show() 方法将其显示出来。
makeText(),需要三个参数,分别是 Content 对象,打印的内容,以及出现时间的长短(使用Toast.LENGTH_SHORT,与Toast.LENGTH_LONG)。在活动中使用menu.
右击 res/menu ,新建 Menu resource file。
在 <menu> 标签中,新建 <item> 标签并添加 id 和 title (菜单栏显示的名称)。
一个 <item> 标签菜单栏的一个选项。
在 activity 中重写 onCreateOptionsMenu()。
可以使用 ctrl+o 重写方法。
实现对菜单选项的注册。
需要使用getMenuInflater().inflate(menu.xml,menu)。
然后,需要定义菜单选项的实际意义,定义响应事件 ,重写onOptionsItemSelected方法,然后通过判断item.getItemID所获取的id对点击不同的菜单选项,响应事件。使用finish(),可以结束活动。
使用 Intent 在活动中跳转。
1)显示 Intent。
Intent intent = new Intent(TestMyActivity.this, MainActivity.class); startActivity(intent);
新建Intent 对象,传入自身content对象,然后第二个参数是需要打开的Activity 的 文件class。
然后使用 startActivity(intent) 就可以打开新的 Activity。
2)隐式 Intent。
需要在 AndroidManifest.xml 文件中对定义的活动进行声明
需要指定需要响应的 action 的字符串
不必要指定 category 默认category 是 android.intent.category.DEFAULT
Intent intent = new Intent("com.tad.activityTest.ACTION_START");
可以通过 Intent 的 addCategory() 添加自己的 category。同时需要在AndroidManifest 文件中,
进行category 的添加。
<category android:name="com.tad.activityTest.MY_CATEGORY" />
intent.addCategory("com.tad.activityTest.MY_CATEGORY");
然后调用 startActivity(intent) 打开新的 Activity。
startActivity(intent);
3) 隐式 Intent 的其他应用 打开其他应用的 Activity。
Intent.ACTION_VIEW 系统内置动作
然后通过Uri 的 parse() 将网址即系为一个 Uri 对象,并用setData 方法将这个对象装在Intent对象里面。
最后启动活动。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
当定义我们自己的应用可以响应的 action 时,注意data 的属性。
例如:
<data android:scheme="http" /> 协议为http
拨打电话 协议为 tel
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
使数据在活动中交互。
1)将数据传递给下一个 Activity
使用显示Intent
通过intent 的 putExtra()方法,将数据进行封装。
第一个参数为键,第二个为值
String stringData = "Hello,I'am the testActivity!";
Intent intent = new Intent(TestMyActivity.this, MainActivity.class);
intent.putExtra("string_data", stringData);
startActivity(intent);
接受方需要通过 getIntent() 获取到 intent 实例。
然后调用 Intent 的 getStringExtra()获得数据,参数为所需数据的 键
Intent intent = getIntent();
String stringData = intent.getStringExtra("string_data");
Log.d(TAG, stringData);
2)传递给下一个Activity数据,并获取下一个Activity 销毁时传回的数据。
传输数据同上,需要将数据封装到一个 Intent 实例中去。
从下一个活动中接受数据:
使用 startActivityResult(),启动应用。
第一个参数为传递的 Intent ,第二个参数为辨识码,用来分辨不同的数据返回源。
Intent intent = new Intent(TestMyActivity.this, MainActivity.class);
intent.putExtra("string_data", "Hello World!");
startActivityForResult(intent , 1);
因为使用 startActivityResult()启动的应用,所以,在下一个 Activity 销毁之后,会调
用 onActivityResult()方法,重写此方法,然后获取数据即可。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode){ case 1: if(resultCode == RESULT_OK){ String returnData = data.getStringExtra("data_return"); Log.d(TAG, returnData); } break; default: } }
被启用的活动应该用 setResult() 返回数据。
第一个参数为处理结果,第二个为数据。
setResult(RESULT_OK,intent);
-
活动的生命周期
onStart (使 activity 可见)
onResume( activity 已经可见)
onPause(activity 暂停,保存属性,还是处于可见状态)
onStop(不可见,部分属性保留)
onDestory (资源释放)
onRestart(activity 重新启用)
当下一个活动彻底将上一个活动遮盖时,会调用onPause和onStop 方法,当下一个活动结束,重新回到上一个活动时,将会调用onRestart 回到 调用 onCreate 之后,然后调用onstart与onresume会带活动栈顶部。
当下一个活动未将上一个活动彻底遮掩时,将只会调用 onPause,下一个活动结束,则直接调用 onResume 重新回到任务栈顶部。 可以重写 onSaveInstanceState 方法,保存系统强行销毁的 activity 的数据。(例如处于onstop状态的activity 由于系统需要内存而强行销毁的 activity 中的数据)。
活动的启动模式。
standrad 每次都会创建新的 activity
singtop 当活动在栈顶时,不会创建新的实例
singTask 栈中只会存在一个某 activity 的实例,调用时会将它上方的所有 activity 出栈
singleInstance 会单独创建一个新的栈,然后将其放进去。当一个栈的所有 Activity 出栈之后,会显示另外一个栈的内容。实际技巧
1) 使用多态,让每一个activity 继承自己定义的类,然后在自己定义的类中打印Activity的名字可以获取当前所在的活动的名称
2) 使用一个activity 类创建管理活。内部有一个 Activity的数组,每次创建活动的时候都将活动加到这个数组中出,然后每次销毁活动的时候将其从队列中移除。可以实现一键关闭所有activity' 的功能
3)可以在需要传递数据的activity 活动中添加 startAction 的方法,传递数据进去这个方法,然后用这个方法启动这个活动。有效加强代码的易用性。
FirstCode 郭霖
整理:tadecather 2017.6.28