第四章:Android应用调试
故意制造bug,比如注释掉某个view的findViewById方法。就会闪退。
Android Link是Android应用代码的静态分析器(static analyzer),实际上,它是无需代码运行就能够检查代码错误的特殊程序。
第五章:第二个Activity
本章学习:
1、创建新的Activity及配套布局
2、启动Activity意味着请求操作熊创新新的Activity实例并调用他的onCreate(Bundle)方法。
3、在父Activity和子Activity之间传递数据
养成在string.xml中定义相关的字符串,到时候用@string来引用。
创建一个新的Activiy需要用到Java类、XML布局和Manifest文件,三者环环相扣。
Tools和tools:context的命名空间比较特别,该命名空间可以覆盖组件的任何属性,以便在Android Studio预览中进行不同的展示
Manifest配置文件是个包含元数据的XML文件,用来向Android操作系统描述应用的,该文件总是以AndroidMainfest.xml命名。
应用的所有activity都需要在Manifest.xml文件中声明。
<activity android:name=“.CheatActivity”>
</activity>
.CheatActivity也可以设置成完整的包路径:com.jifenzhi….CheatActivity
一个activity启动另一个activity最简单的方式是时候用startActivity方法:
public void startActivity(Intent intent)
activity调用startActivity(…)方式时,调用请求实际发给了操作系统。准确的说,调用请求发给了操作系统的ActivityManager。ActivityManager负责创建Activity实例并调用其onCreate(…)方法。
那么ActivityManager该启动哪个Activity呢,答案就在于传入startActivity()方法的Intent参数。
基于intent的通讯:
intent是组件用来与操作系统通讯的一种媒介。本章为止我们唯一见过的组件就是activity,实际上还有组件为:service、broadcast receiver和content provider。成为Android 四大组件。
intent是一种多用途通信工具,Intent类提供了多个构造方法,以满足不同的使用需求。
如:intent用来告诉ActivityManager该启动哪个activity,因此使用如下构造方法:
public Intent(Context packageContext, Class<?> cls>) —> 传入的class就是告诉ActivityManager应该启动的activity;Context参数是告诉ActivityManager在哪里可以找到它。
示例:
Intent i = new Intent(QuizActivity.this, CheatActivity.class);
startActivity(i);
注意:在启动Activity前,ActivityManager会检查确认指定的Class是否已在配置文件Manifest中声明,如果已经完成声明,则启动activity,反之,则抛出ActivityNotFountException异常。
显示和隐式intent:
如果通过指定了Context和Class对象,然后调用intent的构造方法来创建Intent,则创建的是显式intent
比如我们可能需要启动另一个应用的activity,可通过隐式intent来处理。
activity之间的数据传递:
intent有一个putExtra的方法,该方法总是接收两个参数,第一个为键,第二个为值(bool或者string或者integer等等)
private static final String EXTRA_ANSWER_IS_TURE= “com.bignerdranch.android.xxx”
获取参数的话,就是public boolean getBooleanExtra(String name, boolean dafaultValue);
Activity.getIntent()方法返回了由startActivity(Intent)方法返回的
获取打开的子Activity的返回值。
父类中:startActivityForResult(intent, REQUEST_CODE_CHEAT);
子类中:通过public final void setResult(int resultCode);
public final void setResult(int resultCode, Intent data)
resultCode可以是Activity.RESULT_OK或者Activity.RESULT_CANCELED(如需自己定义结果代码,还可以使用另一个常量:RESULT_FIRST_USER)
如果父类是以startActivityForResult()的方法启动的,那么记过代码总是会返回给父Activity。
处理返回结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_CODE_CHEAT) {
if (date == null) {
return;
}
mIsCheater = CheatActivity.wasAnswerShown(data);
}
}
启动原理:
在桌面点击应用图标的时候,操作系统并没有启动应用,而只是启动了应用中的一个activity,确切的说,是启动了应用功能的launcher activity。(我们可以在Manifest.xml中看到)
<activity
android:name=“com.android.geoquiz.QuizActivity”
android:label=“@string/app_name” >
<intent-filter>
<action android:name=“android.intent.action.MAIN” />
<categoty android:name=“andorid.intent.categoty.LAUNCHER” />
</intent>
</activity>
可以知道,ActivityManager维护者一个非特定应用独享的回退栈。