自学安卓编程权威指南(四)

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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值