Android四大组件之Activity

前面的话

在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.csdn.net/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: 单一实例.
(一个应用一般只有一个任务栈,也可能对应多个任务栈)

整个手机系统里只有一个实例存在,并且运行在自己单独的任务栈里面(单独包间).
实例: 谷歌通话应用

未完待续….

接下来会继续更新其他三种组件的特点, 不喜勿喷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值