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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值