android程序设计activity,《Android编程权威指南》之第二个activity

继续继续!《Android编程权威指南》第五章,Demo比较简单,总结重点吧。

本章节知识点的Demo很有意思,就是添加个acitivity,方便用户偷看当前问题的答案。

创建第二个activity

创建新的activity,如果一步步来,记得要创建Java类、XML布局,还有崽manifest文件中注册!一个都不能少,因此书中建议,使用AS新建的activity向导功能,右击包,New->Acitvity->Empty Activity

95f0f7ae9d17?appinstall=0

截图取自demo

95f0f7ae9d17?appinstall=0

截图取自demo这样子的话,AS自动把前面几个都创建好也注册了。

这里介绍了一个tools:text属性,在textview中使用这个,预览的时候能看到文字显示,实际运行不会显示,这个很方便!

AS快捷键Command+Shift+O(或Ctrl+Shift+N)快速打开文件。

启动acitivty

public void startActivity(Intent intent)

调用请求发送给了操作系统的ActivityManager。ActivityManager负责创建Activity实例并调用其onCreate(Bundle)方法。

95f0f7ae9d17?appinstall=0

截图取自本书

intent —— 是component用来与操作系统通信的一种媒介工具,用来告诉ActivityManager该启动哪个activity。component除了activity,还包括service、broadcast receiver以及content provider。

public Intent(Context packageContext, Class> cls) —— Class类型参数告诉ActivityManager应该启动哪个activity;Context参数告诉ActivityManager在哪里可以找到它。

95f0f7ae9d17?appinstall=0

截图取自此书

btnCheat.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(QuizActivity.this, CheatActivity.class);

startActivity(intent);

}

});

在启动activity前,ActivityManager会确认指定的Class是否已在manifest配置文件中声明。

若已声明,则启动activity,应用正常运行。反之,则抛出ActivityNotFoundException

异常,应用崩溃,所以,activity切记要在manifest配置文件中声明好。

上述指定Context与Class对象的创建intent的方式是一种显示创建intent的方式。

activity 间的数据传递

使用 intent extra —— extra是一种键值结构。

95f0f7ae9d17?appinstall=0

截图取自此书

在CheatActivity中,创建newIntent(...)静态方法,这样配置传递intent就容易很多了。

private static final String EXTRA_ANSWER_IS_TRUE = "com.bignerdranch.android.geoquiz.answer_is_true";

public static Intent newIntent(Context packageContext, boolean answerIsTrue) {

Intent intent = new Intent(packageContext, CheatActivity.class);

intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);

return intent;

}

btnCheat.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();

Intent intent = CheatActivity.newIntent(QuizActivity.this, answerIsTrue);

startActivity(intent);

}

});

CheatAcitivity中获取extra中的信息:

boolean mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);

接下来一些demo的处理代码,不贴了,自己写一遍总是好的。

从子 activity 获取返回结果

这里讲了另外一个方法:

public void startActivityForResult(Intent intent, int requestCode

第一个参数:同前述的intent。

第二个参数:请求代码,先发送给子activity,然后再返回给父activity的整数值,由用户定义。在一个activity启动多个不同类型的子activity,且需要判断消息回馈方时,就会用到该请求代码。为应对未来的需求变化,应设置请求代码常量。

private static final int REQUEST_CODE_CHEAT = 0;

startActivity(intent);->改为startActivityForResult(intent, REQUEST_CODE_CHEAT);

设置返回结果

public final void setResult(int resultCode)

public final void setResult(int resultCode, Intent data)

resultCode预定义常量:

(1) Activity.RESULT_OK

(2) Activity.RESULT_CANCELED

(如需自己定义结果代码,可使用另一个常量:RESULT_FIRST_USER)

在父activity需要依据子activity的完成结果采取不同操作时,设置结果代码就非常有用。

返还intent

创建intent,把要回传的信息设置进去,回到原来activity后,,ActivityManager会回调 protected void onActivityResult(int requestCode, int resultCode, Intent data) 方法,覆盖此方法,拿到数据做处理。

CheatActivity.java

private static final String EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown";

点击事件最后调用方法:

private void setAnswerShownResult(boolean isAnswerShown) {

Intent data = new Intent();

data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);

setResult(RESULT_OK, data);

}

95f0f7ae9d17?appinstall=0

截图取自此书

处理返回结果

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode != Activity.RESULT_OK) {

return;

}

if (requestCode == REQUEST_CODE_CHEAT) {

if (data == null) {

return;

}

mIsCheater = CheatActivity.wasAnswerShown(data);

}

}

然后书中项目代码再一些其他处理,按照书中练习一遍的啦。

activity 的使用与管理

manifest配置文件中,,QuizActivity声明的intent-filter元素节点下,代表它是launcher activity。

95f0f7ae9d17?appinstall=0

image.png

ActivityManager维护着一个非特定应用独享的回退栈,activity的启动是以栈的形式一层一层叠上去的,当然这是标准模式喽,还有其他的模式,一般项目中弄个统一管理acitivity的工具类,可以随时管理自己打开的所有的activity。

挑战练习:堵住漏洞

用户作弊后,可以旋转CheatActivity来清除作弊痕迹

首次在CheatActivity中把isAnswerShown拿出来定义,默认值为false

private boolean isAnswerShown = false;

去掉setAnswerShownResult()方法,覆盖onBackPressed()方法,在每次点击了返回键再设置返回结果值,在点击了showAnswer按钮给isAnswerShown 设置为true

@Override

public void onBackPressed() {

Intent data = new Intent();

data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShow);

setResult(RESULT_OK, data);

super.onBackPressed();

}

上面代码要注意一个问题,setResult一定要在此页面finish之前调用,也就在super.onBackPressed();之前调用,不然,前面页面取到的data为null。

为了解决这里旋转清除记录问题,当然是继续覆盖onSaveInstanceState()保存数据喽,然后在onCreate()方法中判断是否有存数据,有就赋值喽

private static final String KEY_IS_ANSWER_SHOW = "is_answer_show";

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putBoolean(KEY_IS_ANSWER_SHOW, isAnswerShow);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_cheat);

if (savedInstanceState != null) {

isAnswerShow = savedInstanceState.getBoolean(KEY_IS_ANSWER_SHOW);

}

...

}

作弊返回后,用户可以旋转QuizActivity来清除mIsCheater变量值

其实这里也一样,解决旋转数据清除问题就是利用savedInstanceState 来保存mIsCheater变量值

private static final String KEY_IS_CHEAT = "is_cheat";

@Override

protected void onCreate(Bundle savedInstanceState) {

...

if (savedInstanceState != null) {

...

mIsCheater = savedInstanceState.getBoolean(KEY_IS_CHEAT);

}

...

}

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

...

outState.putBoolean(KEY_IS_CHEAT, mIsCheater);

}

用户可以不断单击NEXT按钮,跳到偷看过答案的问题,从而使作弊纪录丢失

看到这个问题,我第一想法就是跟禁止一题多答的解决方案一样,暂时还没想到其他的解决方案。

先删掉原来的定义以及处理,然后定义好问题们是否被偷看答案的数组

private boolean[] isQuestionsCheater = new boolean[mQuestionBank.length];

然后修改下onActivityResult里面的代码

95f0f7ae9d17?appinstall=0

image.png

checkAnswer方法里面修改下条件

if (isQuestionsCheater[mCurrentIndex]) {

messageResId = R.string.judgment_toast;

} else {

...

}

接下来又是解决旋转问题了

95f0f7ae9d17?appinstall=0

image.png

95f0f7ae9d17?appinstall=0

image.png

Android开发权威指南》内容上涵盖了用最新的Android版本开发的大部分场景 全书分4个部分 分别从Android基础介绍 环境搭建 SDK介绍 到应用剖析 组件介绍 综合实例演示 以及符合潮流的 最新的移动开发技术 如HTML5 OpenGL ES NDK编程 Android测试驱动开发等几个方面讲述 从技术实现上 讲解了6大完整综合案例及源代码分析 分别是新浪微博客户端 蓝牙聊天 全键盘输入法 月球登陆(游戏) 贪吃蛇(游戏) 笑脸连连看(游戏)   《Android开发权威指南》注重对实际动手能力的指导 在遵循技术研发知识体系严密性的同时 在容易产生错误 不易理解的环节上配备了翔实的开发情景截图;并将重要的知识点和开发技巧以“多学一招” “扩展学习” “技巧点拨”等的活泼形式呈现给读者 在程序实例的讲解方面 主要将实例安插在Android开发的精髓知识章节 这为读者学习与实践结合提供了很好的指导   《Android开发权威指南》配套光盘包含开发视频及全部源程序 指导读者快速 无障碍地学通Android实战开发技术   《Android开发权威指南》适合具备一定软件开发经验 想快速进入Android开发领域的程序员 具备一些手机开发经验的开发者和Android开发爱好者学习使用;也适合作为相关培训学校的Android培训教材 目录: 第一部分 准备篇 第1章 初识庐山真面目 Android开发简介 第2章 工欲善其事 必先利其器 搭建和使用Android开发环境 第二部分 基础篇 第3章 千里之行始于足下 Android程序设计基础 第4章 我的UI我做主 用户界面开发基础 第5章 良好的学习开端 控件 Widget 详解 第6章 友好的菜单 Menu介绍与实例 第7章 友好地互动交流 信息提醒 对话框 Toast与Notification 第8章 移动的信息仓库 数据存储 第9章 Android中的窗口 Activity 第10章 全局事件 广播 Broadcast 第11章 跨应用数据源 Content Provider 第12章 一切为用户服务 Service基础与实例 第13章 做好应用桥梁 网络与通信 第14章 炫酷你的应用 多媒体开发 第15章 D游戏开发 第16章 有趣的Android应用 第三部分 高级篇 第17章 HTML5与移动Web开发 第18章 输入法开发 第19章 Android OpenGL ES开发基础 第20章 OpenGL ES的超酷效果 第21章 Android NDK编程 第22章 测试驱动开发 TDD 第四部分 综合实例篇 第23章 Android综合案例一 蓝牙聊天 第24章 Android综合案例二 月球登陆 游戏 第25章 Android综合案例三 全键盘输入法 应用 第26章 Android综合案例四 贪吃蛇 游戏 第27章 Android综合案例五 新浪微博客户端 应用 第28章 Android综合案例六 笑脸连连看 游戏 ">《Android开发权威指南》内容上涵盖了用最新的Android版本开发的大部分场景 全书分4个部分 分别从Android基础介绍 环境搭建 SDK介绍 到应用剖析 组件介绍 综合实例演示 以及符合潮流的 最新的移动开发技术 如HTML5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值