1.从一个activity启动另一个activity,启动就是指请求Android系统创建一个新的activity实例,并调用onCreate(Bundle)方法
2.tools和tools:text属性的命名空间比较特别,该命名空间可以覆盖某个组件的任何属性,这样就可以在Android Studio预览中看见效果,而在应用运行时,效果不会显示出来
3.如果想要快速找到某个文件,可以通过 Ctrl + Shift + N快捷键来打开对话框,然后直接输入文件名
4.一个activity启动另一个activity的最简单的方法就是使用startActivity方法,启动activity就是调用activity子类的该方法,然后该方法把请求发送给操作系统,准确来说是发送给操作系统的activityManager,activityManager负责创建activity实例和调用其onCreate()方法,而该调用哪一个方法就是得看传入start Activity(Intent)的参数
5.intent是一种多用途的通信工具,调用下面的方法
public Intent (Context packageContext,Class>cls)
传入该方法的Class类型参数告诉ActivityManager应该启动哪一个activity,Context参数告诉ActivtiyManager在哪里可以找到它,在启动activity前,ActivityManager会确认Class是不是已经在manifest中配置声明好了,如果已经声明好了就会启动,如果没有声明好,那么就会崩溃。
6显式Intent:通过指定Context与Class对象,然后使用intent的构造方法来创建Intent
隐式Intent:直接使用某个url
7.activity之间的数据传递,要考虑两个activity之间的数据传递,那么我们应该使用intent extra 来传递数据,该值将作为extra信息,附加在startActivity(Intent)方法的Intent发送出去,接受方activity接受到操作系统转发的intent后,访问和获取其中的extra数据信息,extral也是一种键值结构,需要调用Intent.putExtra()方法
public Intent putExtra(String name,boolean valve);
有两个参数,一个是固定的String类型的键,一个是键值,可以是多种数据类型,该方法返回intent自身
8.activity可能启动不同的地方,所以应该在获取和使用extra信息的activity中去为它定义一个键,记得用包名来修饰extra数据信息,这样可以避免来自不同应用的extra间发生命名冲突
9.对于接受Intent的activity来说,发送的那个activity不需要知道其逻辑细节,发送的那个activity只需要知道,从哪里发和发送什么东西就可以了,所以我们可以在接受的extra的那个activity中用newIntent(..)方法来封装这些逻辑,如下面
先创建一个键
private static final String EXTRA_ANSWER_IS_TRUE = "com......";
后建立一个方法
public static Intent newIntent(Context packageContext,boolean awswerIsTrue) {
Intent intent = new Intent(packageContext,CheatActivity.class);
intent.putExtra(EXTRA_ANSWER_IS_TRUE,answerIsTrue);
return intent;
}
这样使用新建的静态方法可以正确地创建Intent,这里只需要一个extra,如果需要多个extra也可以加到Intent上,只需要相应地添加相应的参数
10.要从extra中获取信息,就需要使用 public boolean getBooleanExtra(String name,boolean defaultValue)第一个参数是extra的名字,第二个是指定的默认的值,编写一个成员变量来存储从extra获取的信息,
private boolean mAnswerIsTrue;
mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false);
11.要从子activity中获得返回的结果,那么就需要调用以下的方法
public void startActivityForResult(Intent intent, int requestCode);
第一个参数是intent,第二个参数是请求代码。请求代码是先发给子activity,然后再返回给父activity的整数值,由用户定义,在一个activity启动多个不同类型的子activity,而且需要判断消息返回方时,就会用到该请求码
首先需要在发出intent上的activity中去定义一个请求码的键
private static final int REQUEST_CODE_CHEAT = 0;
然后发起intent
startActivityForResult(intent,REQUEST_CODE_CHEAT);
12.子activity发送返回消息给父activity,可以调用以下两个方法
public final void setResult(int resultCode)
public final void setResult(int resultCode,Intent data);
resultCode可以是下面的任意一个预定的常量
Activity.RESULT_OK
Activty.RESULT_CANCELED
父activity需要依赖子activity的完成结果来采取不同的操作时,设置结果代码是很有用的,子activity的不同按钮可以设置有不同的结果码,根据不同的结果码,父activity会有不同的操作,如果子activity没设置setResult(),那么操作系统会发送默认的结果码,按后退键,此时父activity会接受到Activity.RESULT_CANCELED的结果码
13.返回intent给父activity,在子activity中,需要返回intent给父activity,那么就需要调用Activity.setResult(int,Intent)方法,我们需要创建一个intent然后加上extra信息,然后调用上面的方法将消息回传给父activity,这边我们可以新建立一个私有方法,用来建立intent附加extra和设置结果码,然后在对应的按钮中去使用该方法,这边我们还需要为extra的键增加一个常量
为extra键常量
private static final String ESTRA_ANSWER_SHOWN = "com.."
私有方法
private void setAnswerShownResult(boolean isAnswerShown) {
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN,isAnswerShown);
setResult(RESULT_OK,data);
}
14.如果结果intent也是子activity的实现细节的话,那么就应该在子activity中去设置一个私有的方法然后交给父activity去调用,
public static boolean wasAnswerShown(Intent result) {
return result.getBooleanExtra(EXTRA_ANSWER_SHOWN,false);
}
15.最后在父activity中新增一个变量来保存从子activity回传来的值,然后覆盖 onActivityResult()来获取它,检查请求代码和返回代码是不是符合预期
protected void onActivityResult(int resquesCode ,int resultCode,Intent data) {
if(resultCodde!=Activity.RESULT_OK){
return;
}
if(requesCode==REQUEST_CODE_CHEAT){
if(data==null){
return;}
mIsCheater = CheatActivity.wasAnswerShownn(data);
}
}
然后判断mIsCheater的值来决定显示不同的toast。