一、创建新的Activity
在进行桌面开发时,我们可以通过一个窗口上的控件事件打开另一个新的窗口。在WEB应用开发时,我们也可以通过一个连接打开一个新的页面。通过添加新的窗口开完善或增强软件的功能,那么在Android应用开发中,我们应该怎样打开新的Activity?
1.添加新的Activity(创建Android工程:MainActivity)
1).新建一个继承自Activity类的类NewActivity
package com.changcheng.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
// 获取按钮并未按钮添加事件
Button button = (Button) this.findViewById(R.id.newa_bt_close);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NewActivity.this.finish();
}
});
}
}
2).AndroidManifest.xml文件中添加
<!--l version=<-->"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
package="com.changcheng.activity"
android:versionCode="1"
android:versionName="1.0">
"@drawable/icon" android:label="@string/app_name">
".MainActivity"
android:label="@string/app_name">
"android.intent.action.MAIN" />
"android.intent.category.LAUNCHER" />
<!-- 新的Activity -->
".NewActivity"
android:label="@string/new_activity" />
"7" />
3).newactivity.xml
<!--l version=<-->"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
"fill_parent"
android:layout_height="wrap_content" android:text="@string/newa_activity" />
<!-- 关闭按钮 -->
"fill_parent"
android:layout_height="wrap_content" android:text="@string/newa_bt_close"
android:id="@+id/newa_bt_close" />
4).strings.xml
<!--l version=<-->"1.0" encoding="utf-8"?>
"hello">Hello World, MainActivity!
"app_name">创建新的Activity
"bt_open_new_activity">打开新的Activity
"new_activity">新的Activity
"newa_activity">新的Activity
"newa_bt_close">关闭
5).MainActivity.java
package com.changcheng.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取按钮,并为按钮添加单击的事件
Button button = (Button) this.findViewById(R.id.bte_open_new_activity);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建显式意图
Intent intent = new Intent(MainActivity.this, NewActivity.class);
// 打开新的Activity
startActivity(intent);
}
});
}
}
二、Activity之间传递参数
在桌面程序中窗口之间,我们可以通过构造参数或全局变量来传递数据。在WEB应用中,我们可以通过域(request\response\session...)在页面之间传递数据。那如何在Android的Activity之间传递参数呢?
通过intent.putExtra方法为意图添加参数,打开新的Activity后可以通过this.getIntent().getStringExtra()等方法获取参数。
三、请求码与结果码
在上面的程序中我们通过startActivity(intent)打开一个新的Activity,Android为了减少组件间的耦合,所以使用了Intent(Intent在下面会有介绍)。所以我们在onClick事件打开的新Activity不与主Activity在一个线程中。但是,当新Activity被关闭后,会触发主Activity的onActivityResult事件。
1.请求码
在一个业务中可能在两个按钮被单击事件中打开同一个Activity,但我们在onActivityResult事件中如何判断是哪个按钮打开了新的Activity?请求码就是为解决这个问题的,那么我们打开新的Activity时应该使用startActivityForResult(intent, 1);。其中的第二个参数就是请求码。
onActivityResult事件:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
}
在onactivityResult事件中,通过判断requestCode更可知道被关闭Activity是通过哪个位置打开的。
2.结果码
在一个业务中可能要打开多个不同的Activity,那关闭Activity时在onactivityResult事件中我们如何知道关闭的是哪一个Activity呢?结果码就是为解决这个问题的,那么我们打开新的Activity时应该使用setResult(2, intent);或在关闭Activity前调用ActivityObj.setResult(2);。其中的第一个参数就是结果码。
在onactivityResult事件中,通过判断resultCode更可知道是哪个Activity被关闭了。
三、Intent意图
Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
Intent可以划分成显式意图和隐式意图:
1).显式意图:调用Intent.setComponent()或Intent.setClass()方法指定了组件名或类对象的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。比如我们上边的打开新的Activity程序。
2).隐式意图:没有调用Intent.setComponent()或Intent.setClass()方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。通过隐式意图打开新的Activity:
AndroidManifest.xml:
<!-- 新的Activity -->
".NewActivity" android:label="@string/new_activity">
"com.changcheng.activity.NewActivity"/>
"android.intent.category.DEFAULT" />
MainActivity:
@Override
public void onClick(View v) {
// 创建显式意图
Intent intent = new Intent("com.changcheng.activity.NewActivity");
//Intent intent = new Intent(MainActivity.this, NewActivity.class);
// 打开新的Activity
startActivity(intent);// 发送Intent时,意图里相当于有一个类别:android.intent.category.DEFAULT
}
在intent过滤器中还可以添加多个action和category,还可以添加data。具体使用在此就不做总结了,可以查看相关资料或帮助文档。
3).显式意图与隐式意图的应用场景:
在项目内部建议使用显式意图。
在应用与应用之间只能使用隐式意图。
四、Activity的生命周期
Activity有三个状态:
当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响应用户操作的Activity。
当它失去焦点但仍然对用户可见时,它处于暂停状态。即在它之上有另外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity。
完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity。
当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
这七个事件定义了Activity的完整生命周期。实现这些事件方法可以帮助我们监视其中的三个嵌套生命周期循环:
1).Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。
2).Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。
3).Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。
五、广播接收者
广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:
1).继承BroadcastReceiver,并重写onReceive()方法。
2).订阅感兴趣的广播Intent,订阅方法有两种:
· 使用代码进行订阅:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
· 在AndroidManifest.xml文件中的节点里进行订阅:
通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完成。
六、服务
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:
1.继承Service类
public class SMSService extends Service { }
2.在AndroidManifest.xml文件中的节点里对服务进行配置:
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。
分享到:
相关推荐
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作。简单来说Intent就是用于组件(这里的组件自然是四大组件)之间传递消息。 它的基本用途:启动Activity,启动服务,传递广播。
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
4.1.5 启动其他Activity并返回结果 185 4.2 Activity的回调机制 189 4.3 Activity的生命周期 190 4.3.1 Activity的生命周期演示 190 4.3.2 Activity与Servlet的相似性与 区别 194 4.4 本章小结 195 ...
5.1 Android Intent基础知识 5.2 Android中可用的Intent 5.3 Intent的组成 5.3.1 Intent和数据URI 5.3.2 一般操作 5.3.3 使用extra信息 5.3.4 使用组件直接调用活动 5.3.5 Intent类别 5.3.6...
答:在AndriodMinifest.xml文件中配置Activity的属性的主题为android:theme="@android:style/Theme.Dialog" 4. 如何退出Activity?如何安全退出已调用多个Activity的Application? 答:单个的Activity,调用...
第一篇 Android开发初步 第1章 Android初识 1.1 Android简介 1.1.1 认识Android 1.1.2 Android系统框架 1.1.3 应用程序框架 1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD ...
[Android开发从零开始].7.Intent初级学习.mp4 67.9MB [Android开发从零开始].8.Activity生命周期.mp4 53.1MB [Android开发从零开始].9.Activity高级学习.mp4 49.5MB [Android开发从零开始].10.LinearLayout学习....
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...
第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...
第1章 Android计算平台简介 1.1 面向新PC的全新平台 1.2 Android的历史 1.3 Dalvik VM剖析 1.4 理解Android软件栈 1.5 使用Android SDK开发最终用户应用程序 1.5.1 Android模拟器 1.5.2 ...
有的设备,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重启 adbd 服务,在设备的终端模拟器上运行: restart adbd 如果 restart 无效,尝试以下命令: start adbd stop adbd 应用管理 ...
话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。 因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在 它的关键生命周期方法(如onCreate()和onResume())里尽可能少的...
|--Activity不允许横竖屏切换 |--Activity常用小技巧 |--Activity按返回直接回到桌面 |--aidl之结合反射获取应用缓存大小等空间占用 |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例...
第一个是通过广播(Broadcast)的形式向Luncher发送请求生成快捷方式的。 在网上找到关于这方面的注册信息。 <!--设置wallpapaer的activity --> <!-- Intent received used to install shortc
Client A 发信息给 Client B , A的信息首先发送信息到服务器Server ,Server接受到信息后再把A的信息广播发送给所有的Clients 首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的...
接收微信的请求及返回值 如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作: a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,...