前面的话
在Android应用中,Activity(界面)可以说是与用户距离最近,出现和隐藏最频繁的那一个!
作为创造Android应用的程序员应该想用户所想,将体验更好,功能更人性化的应用展现给广大Android粉们.
问题来了… 如何才能做出界面跳转更顺畅,各个界面关联条理清晰的应用呢?
这就得看你对界面跳转的意图玩得溜不溜了…
界面跳转–意图
1.显示意图
*必须要指定被开启的Activity的类名或者路径名
激活自己应用程序内部的组件,使用显式意图.(应用内部跳转)
效率高
应用场景: 实际开发多为此意图.
<小案例:模拟短信助手>
需求: 实现选择添加联系人,以及选择添加短信模板.
思路:
代码:
主界面A:
package com.yashiro.activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import com.yashiro.coolnews.R;
public class SmsHelperActivity extends Activity {
private EditText et_message;
private EditText et_contact;
private SharedPreferences sp;
private SharedPreferences sp2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smshelper);
et_message = (EditText) findViewById(R.id.et_message);
et_contact=(EditText) findViewById(R.id.et_contact);
//回显短信信息
sp = getSharedPreferences("config",0);
et_message.setText(sp.getString("temp", ""));
//回显联系人信息
sp2=getSharedPreferences("config2", 0);
et_contact.setText(sp2.getString("contact", ""));
}
@Override
/**
* 在onDestroy()方法里执行保存数据的操作
*/
protected void onDestroy() {
//保存短信信息
String temp = et_message.getText().toString().trim();
Editor editor = sp.edit();
editor.putString("temp", temp);
editor.commit();
//保存联系人信息
String contact=et_contact.getText().toString().trim();
Editor editor2 = sp2.edit();
editor2.putString("contact", contact);
editor2.commit();
super.onDestroy();
}
/**
* 发送获取短信信息的请求到新的界面:SmsListActivity.class
* 选择信息模板
* @param view
*/
public void selectSmsContent(View view) {
Intent intent = new Intent(this, SmsHelperActivity_MsgList.class);
// 开启新的Activity并且获取返回值,请求码为1
startActivityForResult(intent, 1);
}
/**
* 开启新的界面 :ContactListActivity.class,选择联系人
* @param view
*/
public void selectContact(View view) {
Intent intent = new Intent(this, SmsHelperActivity_ContactList.class);
// 开启新的Activity并且获取返回值,请求码为2
startActivityForResult(intent, 2);
}
@Override
/**
* 根据请求码获取相应的其他界面的返回值
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
String contact=data.getStringExtra("contact");
et_contact.setText(contact);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
子界面B(C界面类似):
package com.yashiro.activity;
import com.yashiro.coolnews.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
public class SmsHelperActivity_ContactList extends Activity {
private ListView lv_contactlist;
private String[] phoneNums = {
"13512340000", "13512340001", "13512340002",
"13512340003", "13512340004", "13512340005", "13512340006" };
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smshelper_contactlist);
lv_contactlist = (ListView) findViewById(R.id.lv_contactlist);
// ArrayAdapter的布局必须是TextView
lv_contactlist.setAdapter(new ArrayAdapter<String>(this,
R.layout.item_smshelper, phoneNums));
// 控件点击事件
lv_contactlist.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String contact = phoneNums[position];
Intent data = new Intent();
data.putExtra("contact", contact);
setResult(0, data); // 结果码,用于判断返回数据的类型
finish();
}
});
}
}
2.隐式意图
*根据需要指定行为(action),数据(data)等属性.
1).API: setAction(), addCategory(), setType()指定数据类型;
2).setData()和setType()不能同时使用,会互相删除. 若需要同时设置这两种属性, 请使用setDataAndType(data, type)替代.
3).在被调用的应用清单文件里找到意图过滤器, 里面有,和(配置数据前缀)等属性, 根据需求写到调用 者的Activity里.
4).应用场景: 激活其他应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用去调用
5).效率低,需要遍历所有其他应用的清单文件.
6).应用场景: 相对少. 腾讯,京东…等大型互联网软件.
<小案例:短信分享>
需求: 在某个应用内部点击短信分享,直接跳转到系统短信应用发送界面.
代码:
/**
* 跳转到短信分享好友界面
* 此处用到了:隐式意图
* @param v
*/
public void msgShare(View v) {
Intent intent = new Intent();
intent.setAction("android.intent.action.SENDTO");
intent.addCategory("android.intent.category.DEFAULT");
intent.addCategory("android.intent.category.BROWSABLE");
intent.setData(Uri.parse("smsto:"));
intent.putExtra("sms_body",
"推荐你使用一款软件,叫XX新闻,网罗最新资讯,时时推送.下载地址,http://blog.youkuaiyun.com/sinat_36700834");
startActivity(intent);
}
注意:
查找系统源码可以找到系统短信的action,data和Category.
Activity的生命周期
*一个生命周期onCreate(), onDestory() 两个方法只执行一次.
*onStart()用户可见Activity界面时调用. 可多次调用
*onStop() 用户不再看见Activity界面时调用. 可多次调用
*onResuem() 获取焦点. 透明界面
*onPause() 失去焦点. 只能看不能摸
*onRestart() 重新启动界面
Activity的启动模式
(在清单文件里设置 节点. android:launchMode=”“)
*standard : 标准的启动模式
开了几个界面就得返回几次
实例:应用默认应用场景
*singleTop: 单一顶部模式.
为了防止出现一些奇怪的用户体验,可使用这个模式. (防止流氓软件无法退出)
实例: 谷歌官方短信应用.
*singleTask : 单一任务栈
*在整个任务栈里,只允许有一个Activity的实例存在.
*再次打开这个activity时,会将这个Activity上面的所有的其他Activity给清空.
*应用场景: 如果这个Activity非常消耗内存和cup资源,建议吧这个Activity做成singleTask.
*比如: 浏览器
*singleInstance: 单一实例.
(一个应用一般只有一个任务栈,也可能对应多个任务栈)
整个手机系统里只有一个实例存在,并且运行在自己单独的任务栈里面(单独包间).
实例: 谷歌通话应用
未完待续….
接下来会继续更新其他三种组件的特点, 不喜勿喷