在本文中,我们将给您介绍关于Android学习笔记的详细内容,并且为您解答十二:Activity-Spinner的相关问题,此外,我们还将为您提供关于Activity笔记(一)android、Andr
在本文中,我们将给您介绍关于Android学习笔记的详细内容,并且为您解答十二:Activity-Spinner的相关问题,此外,我们还将为您提供关于Activity笔记(一) android、Android Activity 和 Intent 机制学习笔记、android activity 详解二:Activity 的生命周期、Android Activity和Intent机制学习笔记的知识。
本文目录一览:- Android学习笔记(十二):Activity-Spinner(android activity)
- Activity笔记(一) android
- Android Activity 和 Intent 机制学习笔记
- android activity 详解二:Activity 的生命周期
- Android Activity和Intent机制学习笔记
Android学习笔记(十二):Activity-Spinner(android activity)
例子一:Spinner的基本实现方法
步骤一:编写Android XML文件
<LinearLayout …… >
<TextView android:id="@+id/spinner_label" …… />
<!-- 经过我们的测试android:drawSelectorOnTop="true | false"不起作用,因此此参数可以不设置 -->
<Spinner android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
步骤二:源代码
1)设置Spinner之中的元素内容,采用了ArrayAdapter来描述,并通过setApdater()来设置adapter
private String[] items= {"lorem", "ipsum", "dolor", "sit", "amet",….
ArrayAdapter<String> aa = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,items); //第二个参数表示spinner没有展开前的UI类型
spin.setAdapter(aa); //之前已经通过Spinner spin = (Spinner) findViewById(R.id.spinner);来获取spin对象
2)设置spinner展开的方式,在上面,我们将通过设置ArrayAdapter的第二个参数,设置了spinner没有展开前的UI格式,simple_spinner_item是textview的label方式,而simple_spinner_dropdown_item这是点击圆圈选择方式。在这个例子中,我们将展开方式设置为点击圆圈选择,如图所示。关于格式,我们会在第二个例子中进行试验。
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
3)使用setOnItemSelectedListener()来设置Spinner的点击触发的callback函数,有onItemSelected和onNothingSelected两个接口需要具体给出。
public class SpinnerTest extends Activity implements OnItemSelectedListener{
protected void onCreate(Bundle savedInstanceState) {
……
spin.setOnItemSelectedListener(this);
… …
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
label.setText(items[arg2]); //label是我们设置的第一个TextView widget,arg2就是元素的pos需要
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
label.setText("");
}
}
例子二:Spinner的UI格式
步骤一:编写Android XML文件
在例子来自Android官方网站的tutorial的例子。我们下载SDK的文档中也带有,可以本地查看。这里我们希望item的元素内容设置都在XML中定义,方便修改以及多国语言版本的实现。
在strings.xml中:
<resources>
<string name="planet_prompt">太阳系行星:</string>
<string-array name="planets_arry">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
在layout的xml中:
<LinearLayout … >
<TextView … />
<Spinner android:id="@+id/spinner4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/planet_prompt" />
</LinearLayout>
在Spinner中,我们设置了prompt,根据@string在strings.xml中查找,prompt的内容为“太阳系行星:”在我们点击展开Spinner中,我们可以看到在最上面增加了提示,如上图所示。
步骤二:编写源代码
1)设置spinner的adapter,并导入数据,以及设置UI格式。
Spinner spin=(Spinner)findViewById(R.id.spinner4);
//createFromResouce将返回ArrayAdapter<CharSequence>,具有三个参数:
//第一个是conetxt,也就是application的环境,可以设置为this,也可以通过getContext()获取.
//第二个参数是从data source中的array ID,也就是我们在strings中设置的ID号;
//第三个参数是spinner未展开的UI格式
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.planets_arry, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(adapter);
在ArrayApdater中我们设置了为展开的方式,android提供了两种格式,当然我们也可以通过Android XML文件进行设置,如同ListView一样,下图分别是设置android.R.layout.simple_spinner_item和 android.R.layout.simple_spinner_dropdown_item的显示,一般而言,我们都会显示前者。
如果我们不通过setDropDownViewResource进行设置,则展开的方式缺省同未展开的方式,否则必须进行设置,下图分别是设置 android.R.layout.simple_spinner_item和 android.R.layout.simple_spinner_dropdown_item。可以看出在下面左边的途中,展开和未展开的设置是不一样的。
2)设置回调函数
这里采用了一个类来描述回调处理
public class MyOnItemSelectedListener implements OnItemSelectedListener{
@Override
public void onItemSelected(AdapterView<?> parent, View arg1, int pos, long arg3){
// 在这里我们复习一下Toast的用法
Toast.makeText(parent.getContext(),
"The planet is "+ parent.getItemAtPosition(pos).toString(),
Toast.LENGTH_LONG).show();
}@Override
public void onNothingSelected(AdapterView<?> arg0) {
//nothing to do
}
}
在程序中使用spin.setOnItemSelectedListener(new MyOnItemSelectedListener());来设置回调对象即可。
例子三:自定义格式和数据
在上面的例子中,为展开和展开后的UI格式采用了Android自定义的格式,都可以自行定义。
ArrayAdapter adapter = new ArrayAdapter(this,R.layout.item,R.id.textView,list);
在上面的例子中,我们使用某个ArrayAdapter的构造函数,其中第一个参数是context,第二个参数指定下来菜单的每个条目的样式,第三个参数指定了在每个条目样式中用于显示数据的TextView的Id,第四个参数为列表的数据来源(可以是任何格式,toString()就是相应的赋值)
Activity笔记(一) android
Activity的生命周期和启动模式(一)
该模块主要是讲Activity的启动模式以及IntentFilter的匹配规则:
Questions:
为什么KP2中这种情况会发生?
KP2中旧的onStop什么时候调用呢? 目前看来是新的activity展示在前台之后会调用(还是说另开线程调用,所以与新的无关?)
KNowledge points:
Activity,Window,Dialog, Toast为四个能够让用户见到的界面。
如果新的activity采用了透明主题,那么当用户打开新的activity或者返回桌面时,改Activity不会调用onStop。
onStart、onStop和onResume、onPause的区别在于前者是从Activity是否可见这个角度进行回调,而后者是Activity是否处于前台这个角度进行回调的。
旧Activity下先pause新的才会执行生命周期
如果一个进程 中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱 离四大组件而独自运行在后台中,这样进程很容易被杀死。比较好的方法是将后台工作放 入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死。
用ApplicationContext无法启动standard模式的activity,但是如果为启动的Activity指定一个FLAG_ACTIVITY_NEW_TASK,这时候Activity就会以singleTask模式启动。
生命周期:
(1) onCreate:表示Activity正在被创建,这是生命周期的第一个方法。在这个方法中, 我们可以做一些初始化工作,比如调用setContentView去加载界面布局资源、初始化Activity 所需数据等。
(2) onRestart:表示Activity正在重新启动。一般情况下,当当前Activity从不可见重 新变为可见状态时,onRestart就会被调用。这种情形一般是用户行为所导致的,比如用户 按Home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会暂停, 也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况。
(3) onStart:表示Activity正在被启动,即将开始,这时Activity已经可见了,但是还 没有出现在前台,还无法和用户交互。这个时候其实可以理解为Activity经显示出来了, 但是我们还看不到。
(4) onResume:表示Activity已经可见了,并且出现在前台并开始活动。要注意这个 和onStart的对比,onStart和onResume都表示Activity己经可见,但是onStart的时候Activity 还在后台,onResume的时候Activity才显示到前台。
(5) onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被调用。在特 殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用。笔者的理 解是,这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、 停止动画等工作,但是注意不能太耗时,因为这会影响到新Activity的显示,onPause必须 先执行完,新Activity的onResume才会执行。
(6) onStop:表Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
(7) onDestroy:表示Activity即将被销毁,这是Activity生命周期中的最后一个回调, 在这里,我们可以做一些冋收工作和最终的资源释放。
异常情况的生命周期分析:
系统配置改变的情况下(比如横屏)Activity被杀死并重新创建:
当系统配置发生改变后,Activity会被销毁,其onPause> onStop、onDestroy均会被调用,系统会调用onSavelnstanceState来保存当前 Activity的状态,调用时机是在onStop之前,它和onPause没有既定的时序关系,,同时,我们要知道,在onSavelnstanceState和onRestorelnstanceState方法中,系统自动 为我们做了一定的恢复工作。当Activity在异常情况下需要重新创建时,系统会默认为我 们保存当前Activity的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、ListView滚动的位置等(每个View都有这两个方法)
关于保存和恢复View层次结构,系统的工作流程是这样的:首先Activity被意外终止 时,Activity会调用onSavelnstanceState去保存数据,然后Activity会委托Window去保存 数据,接着Window再委托它上面的顶级容器去保存数据。顶层容器是一个ViewGroup, 一般来说它很可能是DecorView,最后顶层容器再去一一通知它的子元素来保存数据,这 样整个数据保存过程就完成了。可以发现,这是一种典型的委托思想,上层委托下层、父 容器委托子元素去处理一件事情,这种思想在Android中有很多应用,比如View的绘制过 程、事件分发等都是采用类似的思想。
onRestorelnstanceState 或者 onCreate,二者的区别是:onRestorelnstanceState 一旦被调用, 其参数Bundle savedlnstanceState 一定是有值的,我们不用额外地判断是否为空;但是 onCreate 不行,onCreate 如果是正常启动的话,其参数 Bundle savedlnstanceState 为 null, 所以必须要额外判断。这两个方法我们选择任意一个都可以进行数据恢复,但是官方文 档的建议是釆用onRestorelnstanceState去恢复数据。
资源内存不足导致低优先级的Activity被杀死
Activity按照优先级从高到低,可以分为如下三种:
(1)前台Activity 正在和用户交互的Activity,优先级最高。
(2)可见但非前台Activity比如Activity中弹出了一个对话框,导致Activity可见
但是位于后台无法和用户直接交互。
(3)后台Activity 已经被暂停的Activity,比如执行了 onStop.优先级最低
如果不希望activity在系统配置变更的时候重新创建
我们不想系统重新创建Activity, 可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建, 就可以给configChanges属性添加orientation这个值
Activity的启动模式
standard 重新创建一个activity。
singletop
栈顶复用,onNewIntent会被回调。
singleTask
栈内复用,onNewIntent会被回调。默认为clearTop。会调用onResume。
singleInstance
指定启动模式
通过AndroidMenifest指定,无法直接设定FLAG_ACTIVITY_CLEAR_TOP
在Intent中指定(优先级比1高),无法设定singleInstance
END 2022/4/7 1h20min
Activity常见的标志位以及匹配规则
Questions
KNowledge points
标记位可以
设定 Activity的启动模式。
影响Activity的运行状态等。
一个个Activity中可以有多个intent-filter, 一个Intent要能匹配 任何一组intent-filter即可成功启动对应的Activity。
IntentFilter的匹配规则
IntentFilter中过滤的信息有action、category、data。
Action的匹配规则
Action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,和过滤规则中任何一个action值匹配就可以,这里 说的匹配是指action的字符串值完全一样。(区分大小写)。
必须有一个action且匹配。
category的匹配规则
Intent中出现的category必须完全匹配每一个intent-filter组其中一个。
可以没有category。
系统调用时会加上默认的category。
data的匹配规则
data的结构:
<data android:scheme="String"
android:host="String"
android:port="String"
android:path="String"
android:pathPattern="String"
android:pathPrefix="String"
android:mimeType="String"/>
由两部分组成,一部分是mimeType,一部分是URI
mimeType: 指媒体类型,比如image/jpeg、 audio/mpeg4-generic和video/*等,可以表示图片、文本、视频等不同的媒体格式。
URI:
<scheme>://<host>:<port>/[<path>I<pathPrefix>I<pathPattern>]
例如:content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
Scheme: URI的模式,比如http、file、content等,如果URI中没有指定scheme,那 么整个URI的其他参数无效,这也意味着URI是无效的。
Host: URI的主机名,比如www.baidu.com,如果host未指定,那么整个URI中的其 他参数无效,这也意味着URI是无效的。
Port: UR1中的端口号,比如80,仅当URI中指定了 scheme和host参数的时候port 参数才是有意义的。
Path, pathPattem和pathPrefix:这三个参数表述路径信息,其中path表示完整的路径 信息;pathPattem也表示完整的路径信息,但是它里面可以包含通配符“”表示0 个或多个任意字符,需要注意的是,由于正则表达式的规范,如果想表示真实的字符串, 那么“*”要写成“\\”,"\\”要写成“\\\\”; pathPrefix表示路径的前缀信息。
匹配规则
data的匹配 规则和action类似,它也要求Intent中必须含有data数据,并且data数据能够完全匹配过 滤规则中的某一个data.这里的完全匹配是指过滤规则中出现的data部分也出现在了 Intent 中的data中。
果要为Intent指定完整的data,必须要调用setDataAndType方法,不能先调 用setData再调用setType,因为这两个方法彼此会清除对方的值。
判断是否能够隐式启动Activity
采用 PackageManager 的 resolveActivity 方法或者 Intent 的 resolveActivity 方法,如 果它们找不到匹配的Activity就会返回null,我们通过判断返回值就可以规避上述错误了。
另外,PackageManager 还提供了 querylntentActivities 方法,这个方法和 resolveActivity 方 法不同的是:它不是返回最佳匹配的Activity信息而是返回所有成功匹配的Activity信息。我们要使用MATCH_ DEFAULT_ONLY这个标记位,这个标记位的含义是仅仅匹配那些在intent-filter中声明了 <category android:name="android.intent.category.DEFAULT/>这个 category 的 Activity。 使用 这个标记位的意义在于,只要上述两个方法不返回null,那么startActivity -定可以成功。 如果不用这个标记位,就可以把intent-filter中category不含DEFAULT的那些Activity给 匹配出来,从而导致startActivity可能失败。因为不含有DEFAULT的intentFilter无法接受隐式intent。
Android Activity 和 Intent 机制学习笔记
Activity
Android 中,Activity 是所有程序的根本,所有程序的流程都运行在 Activity 之中,Activity 具有自己的生命周期(见 http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用 onSaveInstanceState 保存其状态)。
对于 Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及 Activity 之间的跳转和数据传输(intent)。
Activity 中常用的函数有 SetContentView() findViewById() finish() startActivity(),其生命周期涉及的函数有:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
注意的是,Activity 的使用需要在 Manifest 文件中添加相应的 <Activity>,并设置其属性和 intent-filter。
Intent
Android 中提供了 Intent 机制来协助应用间的交互与通讯,Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用。Intent 不仅可用于应用程序之间,也可用于应用程序内部的 Activity/Service 之间的 交互。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在 SDK 中给出了 Intent 作用的表现形式为:
通过 Context.startActivity () 或者 Activity.startActivityForResult () 启动一个 Activity;
通过 Context.startService () 启动一个服务,或者通过 Context.bindService () 和后台服务交互;
通过广播方法 (比如 Context.sendBroadcast () , Context.sendOrderedBroadcast () , Context.sendStickyBroadcast ()) 发给 broadcast receivers。
Intent 属性的设置,包括以下几点:(以下为 XML 中定义,当然也可以通过 Intent 类的方法来获取和设置)
(1)Action,也就是要执行的动作
SDk 中定义了一些标准的动作,包括
onstant | Target component | Action |
---|---|---|
ACTION_CALL | activity | Initiate a phone call. |
ACTION_EDIT | activity | Display data for the user to edit. |
ACTION_MAIN | activity | Start up as the initial activity of a task, with no data input and no returned output. |
ACTION_SYNC | activity | Synchronize data on a server with data on the mobile device. |
ACTION_BATTERY_LOW | broadcast receiver | A warning that the battery is low. |
ACTION_HEADSET_PLUG | broadcast receiver | A headset has been plugged into the device, or unplugged from it. |
ACTION_SCREEN_ON | broadcast receiver | The screen has been turned on. |
ACTION_TIMEZONE_CHANGED | broadcast receiver | The setting for the time zone has changed. |
当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如 "com.example.project.SHOW_COLOR”),并可定义相应的 Activity 来处理我们的自定义动作。
(2)Data,也就是执行动作要操作的数据
Android 中采用指向数据的一个 URI 来表示,如在联系人应用中,一个指向某联系人的 URI 可能为:content://contacts/1。对于不同的动作,其 URI 数据的类型是不同的(可以设置 type 属性指定特定类型数据),如 ACTION_EDIT 指定 Data 为文件 URI,打电话为 tel:URI,访问 网络为 http:URI,而由 content provider 提供的数据则为 content:URIs。
(3)type(数据类型),显式指定 Intent 的数据类型(MIME)。一般 Intent 的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
(4)category(类 别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示 Intent 的接受者应该在 Launcher 中作为顶级应用出现;而 ALTERNATIVE_CATEGORY 表示当前的 Intent 是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。还有其他的为
Constant | Meaning |
---|---|
CATEGORY_BROWSABLE | The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message. |
CATEGORY_GADGET | The activity can be embedded inside of another activity that hosts gadgets. |
CATEGORY_HOME | The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. |
CATEGORY_LAUNCHER | The activity can be the initial activity of a task and is listed in the top-level application launcher. |
CATEGORY_PREFERENCE | The target activity is a preference panel. |
(5)component(组 件),指定 Intent 的的目标组件的类名称。通常 Android 会根据 Intent 中包含的其它属性的信息,比如 action、data/type、category 进行查找,最终找到一个与之匹配的目标组件。但是,如果 component 这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent 的其它所有属性都是可选的。
(6)extras(附加信息),是其它所有附加信息的集合。使用 extras 可以为组件提供扩展信息,比如,如果要执行 “发送电子邮件” 这个动作,可以将电子邮件的标题、正文等保存在 extras 里,传给电子邮件发送组件。
理解 Intent 的关键之一是理解清楚 Intent 的两种基本用法:一种是显式的 Intent,即在构造 Intent 对象时就指定接收者;另一种是隐式的 Intent,即 Intent 的发送者在构造 Intent 对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。
对于显式 Intent,Android 不需要去做解析,因为目标组件已经很明确,Android 需要解析的是那些隐式 Intent,通过解析,将 Intent 映射给可以处理此 Intent 的 Activity、IntentReceiver 或 Service。
Intent 解析机制主要是通过查找已注册在 AndroidManifest.xml 中的所有 IntentFilter 及其中定义的 Intent,最终找到匹配的 Intent。在这个解析过程中,Android 是通过 Intent 的 action、type、category 这三个属性来进行判断的,判断方法如下:
如果 Intent 指明定了 action,则目标组件的 IntentFilter 的 action 列表中就必须包含有这个 action,否则不能匹配;
如果 Intent 没有提供 type,系统将从 data 中得到数据类型。和 action 一样,目标组件的数据类型列表中必须包含 Intent 的数据类型,否则不能匹配。
如果 Intent 中的数据不是 content: 类型的 URI,而且 Intent 也没有明确指定它的 type,将根据 Intent 中数据的 scheme (比如 http: 或者 mailto:) 进行匹配。同上,Intent 的 scheme 必须出现在目标组件的 scheme 列表中。
如果 Intent 指定了一个或多个 category,这些类别必须全部出现在组建的类别列表中。比如 Intent 中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
Intent-Filter 的定义
一些属性设置的例子:
<action android:name="com.example.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />
完整的实例
<activity android:name="NotesList" android:label="@string/title_notes_list">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
</activity>
Intent 用法实例
1. 无参数 Activity 跳转
Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);
2. 向下一个 Activity 传递数据(使用 Bundle 和 Intent.putExtras)
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle); // it.putExtra(“test”, "shuju”);
startActivity(it); // startActivityForResult(it,REQUEST_CODE);
对于数据的获取可以采用:
Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");
3. 向上一个 Activity 返回结果(使用 setResult,针对 startActivityForResult (it,REQUEST_CODE) 启动的 Activity)
Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString("name", "This is from ShowMsg!");
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);
4. 回调上一个 Activity 的结果处理函数(onActivityResult)
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE){
if(resultCode==RESULT_CANCELED)
setTitle("cancle");
else if (resultCode==RESULT_OK) {
String temp=null;
Bundle bundle=data.getExtras();
if(bundle!=null){
temp=bundle.getString("name");
}
setTitle(temp);
}
}
}
下面是转载来的其他的一些 Intent 用法实例(转自 javaeye)
显示网页
Uri uri = Uri.parse("http://google.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
显示地图
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//其他 geo URI 範例
//geo:latitude,longitude
//geo:latitude,longitude?z=zoom
//geo:0,0?q=my+street+address
//geo:0,0?q=business+near+city
//google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom
路径规划
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456
打电话
//叫出拨号程序
Uri uri = Uri.parse("tel:0800000123");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
//直接打电话出去
Uri uri = Uri.parse("tel:0800000123");
Intent it = new Intent(Intent.ACTION_CALL, uri);
startActivity(it);
//用這個,要在 AndroidManifest.xml 中,加上
//<uses-permission id="android.permission.CALL_PHONE" />
传送 SMS/MMS
//调用短信程序
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
//传送消息
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);
//传送 MMS
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);
传送 Email
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));
Intent it=new Intent(Intent.ACTION_SEND);
String[] tos={"me@abc.com"};
String[] ccs={"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));
//传送附件
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));
播放多媒体
Uri uri = Uri.parse("file:///sdcard/song.mp3");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
it.setType("audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
Market 相关
//寻找某个应用
Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where pkg_name is the full package path for an application
//显示某个应用的相关信息
Uri uri = Uri.parse("market://details?id=app_id");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where app_id is the application ID, find the ID
//by clicking on your application on Market home
//page, and notice the ID from the address bar
Uninstall 应用程序
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);
android activity 详解二:Activity 的生命周期
管理 Activity 的生命周期
通过实现 activity 的生命周期回调方法来管理你的 activity,是创造既稳定又灵活的 activity 的关键。Activity 的生命周期直接受到相关的其它 activity 和它的任务以及所在栈的影响。
一个 activity 可生存在三种基本的状态中:
Resumed
Activity 位于屏幕的最上层,并具有用户焦点,用户可以操作它。(此状态有时也被认为是 “运行” 状态)。
Paused
Activity B 位于最上层并其获得输入焦点,acitvity A 位于其下一层,但 activity A 依然可见,此时 activity A 就处于 Paused 状态。Activity A 可见的原因可能是 activity B 是半透明的,或 acitvity B 不覆盖整个屏幕。此状态的 activity 依然是 “活” 的,因为它还是位于内存中,并且它被窗口管理器所管理。它只要获取到 CPU 时间片它就可以接着运行,当然系统此时是不想让它运行的,所以不给它 CPU 时间片。此状态的 activity 在 RAM 剩余极少时,可能被系统杀掉。
Stoped
一个 Activity 如果被其它 activity 完全遮盖,那么它就处于 Stoped 状态。此时它处于 “后台”。此状态的 activity 也是 “活” 的,它依然位于内存中,但是窗口管理器中把它除名。然而,它不再被用户看到并且系统可以在其它组件需要内存时把它杀掉,也就是说它比 paused 状态的更容易被杀害。
如果一个 activtiy 处于 paused 或 stoped 状态,系统可以杀死它。杀死它的方法有比较温和的:请求 activity 用 finish () 自杀,或直接用暴力的方法:杀掉 activity 所在的进程。不论怎样,activity 被从内存中移除。当被杀或自杀的 activity 重新启动时,它必须被从头创建。
实现生命周期回调
public class ExampleActivity extends Activity {
public voidonCreate(Bundle savedInstanceState) {
// Theactivity is being created.
@Override
super.onStart();
}
protected voidonResume() {
// Theactivity has become visible (it is now "resumed").
@Override
super.onPause();
}
protected voidonStop() {
// Theactivity is no longer visible (it is now "stopped")
@Override
super.onDestroy();
}
注意:当你覆写以上函数时,必须首先调用父类的同一方法,就像上例中所示。
这六个方法涵盖了 activity 的整个生命周期,覆写这些方法们,可以监视 activity 生命周期中三种状态的嵌套循环:
l Activity 的可见期位于 onStart() 和 onStop() 之间。在可见期内,用户可以看到 activity 并与它交互。例如:onStop() 在新的 activity 启动并且当前 activity 不在被看到时被调用。在可见期内,你可以在内存中保持与 activity 显示相关的资源。例如:你可以在 onStart() 中注册一个 BroadcastReceiver,以监视对界面有影响的系统事件(比如主题或字体的改变);并其在 onStop() 中取消注册,因为此时用户看不到这个 activity 的界面了。在整个生命周期中,onStart() 和 onStop() 会被多次调用,因为 activity 可能多次显示又隐藏,隐藏又显示…
下图展示了这些循环以及在状态切换时 activity 所经过的步骤。方框表示回调方法。
下表更详细的介绍了生命周期函数的事项。
方法 |
描述 |
完成后可杀掉? |
下一个 |
onCreate() |
当 activity 被创建时调用。这是做一般的静态初始化的地方,比如创建界面,把数据绑定到列表,等等之类。这个方法会被传入一个 Bundle 对像,它包含了 activity 的上一次(关闭时)的状态(如果这个状态可以得到)。此方法后面永远跟着 onStart ()。 |
否 |
onStart() |
onRestart() |
在停止后被调用,但不是停止后马上调用,而是在再次开始前调用,也就是在再次调用 onStart () 之前立即调用。 |
否 |
onStart() |
onStart() |
当 activity 变成可见后立即调用它。如果 activity 成为最上层,则调用 onResume (),如果完全被摭盖,就调用 onStop ()。 |
否 |
onResume () 或 onStop () |
onResume() |
当 activity 处于最上层时,立即调用此方法。此时 activity 获得输入焦点。后面跟着 onPause ()。 |
否 |
onPause() |
onPause() |
当另一个 activity 要进入 Pause 状态时调用此方法。这个方法一般是用来提交那些发生改变的永久化的数据们,停止动画和其它消耗 CPU 的玩意们。这些工作必须以最快的速度完成,因为在这个方法返回之前,另一个 activity 就不能进入 resume 状态。当它又回到最上层时,后面跟着 onResume (),当它被完全摭盖时,后面跟着 onStop ()。 |
是 |
onResume() or onStop() |
onStop() |
当 activity 被完全摭盖时被调用。当 activity 要销毁时或被其它 activity 完全摭盖时都会发生。如果这个 activity 又回到最上层,则后面跟着 onRestart (),如果它逝去了,则跟着 onDestroy ()。 |
是 |
onRestart() or onDestroy() |
onDestroy() |
在 activity 销毁之前被调用。这是 activity 能收到的最后一个调用。调用的原因可能是别人在这个 activity 上调用了 finish (),也可能是系统为了更多的内存空间而把它所在的进程处死了。在这个方法中,可以调用 isFinishing () 来判断自己属于哪一种死法。 |
是 |
nothing |
原文链接: http://blog.csdn.net/nkmnkm/article/details/7103907
Android Activity和Intent机制学习笔记
Activity
Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity具有自己的生命周期(见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系统控制生命周期,程序无法改变,但可以用onSaveInstanceState保存其状态)。
对于Activity,关键是其生命周期的把握(如下图),其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity之间的跳转和数据传输(intent)。
Activity中常用的函数有SetContentView() findViewById() finish() startActivity(),其生命周期涉及的函数有:
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
注意的是,Activity的使用需要在Manifest文件中添加相应的<Activity>,并设置其属性和intent-filter。
Intent
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK中给出了Intent作用的表现形式为:
- 通过
orContext.startActivity()
启动一个Activity;Activity.startActivityForResult()
- 通过
启动一个服务,或者通过Context.startService()
和后台服务交互;Context.bindService()
- 通过广播方法(比如
,Context.sendBroadcast()
,Context.sendOrderedBroadcast()
) 发给broadcast receivers。Context.sendStickyBroadcast()
Intent属性的设置,包括以下几点:(以下为XML中定义,当然也可以通过Intent类的方法来获取和设置)
(1)Action,也就是要执行的动作
SDk中定义了一些标准的动作,包括
onstant | Target component | Action |
---|---|---|
ACTION_CALL |
activity | Initiate a phone call. |
ACTION_EDIT |
activity | Display data for the user to edit. |
ACTION_MAIN |
activity | Start up as the initial activity of a task, with no data input and no returned output. |
ACTION_SYNC |
activity | Synchronize data on a server with data on the mobile device. |
ACTION_BATTERY_LOW |
broadcast receiver | A warning that the battery is low. |
ACTION_HEADSET_PLUG |
broadcast receiver | A headset has been plugged into the device, or unplugged from it. |
ACTION_SCREEN_ON |
broadcast receiver | The screen has been turned on. |
ACTION_TIMEZONE_CHANGED |
broadcast receiver | The setting for the time zone has changed. |
当然,也可以自定义动作(自定义的动作在使用时,需要加上包名作为前缀,如"com.example.project.SHOW_COLOR
”),并可定义相应的Activity来处理我们的自定义动作。
(2)Data,也就是执行动作要操作的数据
Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。对于不同的动作,其URI数据的类型是不同的(可以设置type属性指定特定类型数据),如ACTION_EDIT指定Data为文件URI,打电话为tel:URI,访问网络为http:URI,而由content provider提供的数据则为content:
URIs。
(3)type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
(4)category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。还有其他的为
Constant | Meaning |
---|---|
CATEGORY_BROWSABLE |
The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message. |
CATEGORY_GADGET |
The activity can be embedded inside of another activity that hosts gadgets. |
CATEGORY_HOME |
The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed. |
CATEGORY_LAUNCHER |
The activity can be the initial activity of a task and is listed in the top-level application launcher. |
CATEGORY_PREFERENCE |
The target activity is a preference panel. |
(5)component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
(6)extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者;另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。
对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
- 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
- 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
- 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
- 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
Intent-Filter的定义
一些属性设置的例子:
<action android:name="com.example.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />
完整的实例
<activity android:name="NotesList" android:label="@string/title_notes_list"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.PICK" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity>
Intent用法实例
1.无参数Activity跳转
Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);
2.向下一个Activity传递数据(使用Bundle和Intent.putExtras)
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle); // it.putExtra(“test”, "shuju”); startActivity(it); // startActivityForResult(it,REQUEST_CODE);
对于数据的获取可以采用:
Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");
3.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)
Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString("name", "This is from ShowMsg!");
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);
4.回调上一个Activity的结果处理函数(onActivityResult)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE){
if(resultCode==RESULT_CANCELED)
setTitle("cancle");
else if (resultCode==RESULT_OK) {
String temp=null;
Bundle bundle=data.getExtras();
if(bundle!=null) temp=bundle.getString("name");
setTitle(temp);
}
}
}
下面是转载来的其他的一些Intent用法实例(转自javaeye)
显示网页
1. Uri uri = Uri.parse("http://google.com");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
显示地图
1. Uri uri = Uri.parse("geo:38.899533,-77.036476");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
4. //其他 geo URI 範例
5. //geo:latitude,longitude
6. //geo:latitude,longitude?z=zoom
7. //geo:0,0?q=my+street+address
8. //geo:0,0?q=business+near+city
9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom
路径规划
1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456
打电话
1. //叫出拨号程序
2. Uri uri = Uri.parse("tel:0800000123");
3. Intent it = new Intent(Intent.ACTION_DIAL, uri);
4. startActivity(it);
1. //直接打电话出去
2. Uri uri = Uri.parse("tel:0800000123");
3. Intent it = new Intent(Intent.ACTION_CALL, uri);
4. startActivity(it);
5. //用這個,要在 AndroidManifest.xml 中,加上
6. //<uses-permission id="android.permission.CALL_PHONE" />
传送SMS/MMS
1. //调用短信程序
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. it.putExtra("sms_body", "The SMS text");
4. it.setType("vnd.android-dir/mms-sms");
5. startActivity(it);
1. //传送消息
2. Uri uri = Uri.parse("smsto://0800000123");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. it.putExtra("sms_body", "The SMS text");
5. startActivity(it);
1. //传送 MMS
2. Uri uri = Uri.parse("content://media/external/images/media/23");
3. Intent it = new Intent(Intent.ACTION_SEND);
4. it.putExtra("sms_body", "some text");
5. it.putExtra(Intent.EXTRA_STREAM, uri);
6. it.setType("image/png");
7. startActivity(it);
传送 Email
1. Uri uri = Uri.parse("mailto:xxx@abc.com");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it, "Choose Email Client"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"me@abc.com"};
3. String[] ccs={"you@abc.com"};
4. it.putExtra(Intent.EXTRA_EMAIL, tos);
5. it.putExtra(Intent.EXTRA_CC, ccs);
6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
8. it.setType("message/rfc822");
9. startActivity(Intent.createChooser(it, "Choose Email Client"));
1. //传送附件
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
5. sendIntent.setType("audio/mp3");
6. startActivity(Intent.createChooser(it, "Choose Email Client"));
播放多媒体
Uri uri = Uri.parse("file:///sdcard/song.mp3");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
it.setType("audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
Market 相关
1. //寻找某个应用
2. Uri uri = Uri.parse("market://search?q=pname:pkg_name");
3. Intent it = new Intent(Intent.ACTION_VIEW, uri);
4. startActivity(it);
5. //where pkg_name is the full package path for an application
1. //显示某个应用的相关信息
2. Uri uri = Uri.parse("market://details?id=app_id");
3. Intent it = new Intent(Intent.ACTION_VIEW, uri);
4. startActivity(it);
5. //where app_id is the application ID, find the ID
6. //by clicking on your application on Market home
7. //page, and notice the ID from the address bar
Uninstall 应用程序
1. Uri uri = Uri.fromParts("package", strPackageName, null);
2. Intent it = new Intent(Intent.ACTION_DELETE, uri);
3. startActivity(it);
关于Android学习笔记和十二:Activity-Spinner的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Activity笔记(一) android、Android Activity 和 Intent 机制学习笔记、android activity 详解二:Activity 的生命周期、Android Activity和Intent机制学习笔记的相关知识,请在本站寻找。
本文标签: