android学习之 intent 实例

网上也有很多文章讲解了intent的用法,自己感觉他的字面意义说到了他的精髓:“目的、意向”,也就是说通过它来告诉应用程序将要做什么,intent正是这样,android通过Intent机制来协助应用间的交互与通讯,网上的一句话来理解:Intent有两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似,只是复用的粒度有所差别;另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,这种方式与函数调用差别比较大,有利于降低发送者和接收者之间的耦合。另外Intent除了发送外,还可用于广播。本文的例子正式介绍其中的显示intent,隐式的Intent将在下一篇中学习。
     实例要达到大致的效果:一个页面显示用户列表,其中有一个按钮来添加用户。
 用户列表界面:
 
添加用户界面:



显示的intent需要明确他的目标Component 也就是intent必须包含具体Component的Name,什么是Component:

大致看下ComponentName源代码:

public  final  class ComponentName  implements Parcelable  {
    private final String mPackage;
    private final String mClass;

构造方法:
 public ComponentName(String pkg, String cls)
 public ComponentName(Context pkg, String cls)
 public ComponentName(Context pkg, Class<?> cls)



其中有这样的介绍:
@param pkg The name of the package that the component exists in.  Can
     * not be null.
     * @param cls The name of the class inside of <var>pkg</var> that
     * implements the component.  Can not be null.
这个成员变量分别为目标的包和class的name
因此可以有三种方法够造ComponentName 例如
new ComponentName(targetclass.class.getPackage().getName(),targetclass.class.getName()));
new ComponentName(this,targetclass.class.getName()));
new ComponentName(this,targetclass.class));
---------------------------------
这样就构建了我们的意图,
但是要通知目标组件实现这个意图:
 可以使用startActivity(intent)方法来启动,但是本文使用了startActivityForResult方法,因为我们需要新打开的activity返回数据(新添加的用户数据),

此方法的参数:startActivityForResult(Intent intent, int requestCode),
requestCode是干嘛的呢:文档是这样说的:

 

requestCode If >= 0,  this code will be returned in
     *                    onActivityResult() when the activity exits.


也就是说如果requestCode>0 我们就可以在目标activity返回的时候执行父窗口(官方叫做originating activity)的onActivityResult方法来处理我们的数据,我们可以使用已经定义好的requestCode,也可以自己定义,在代码中我直接给赋值为1,正如文档所说的,我们在用户类表的activity里面重写onActivityResult方法来刷新界面,以显示新添加的用户。
  下面来看下我们的本实例的两个activity:
首先是用户列表activity:Test1.java:(使用到了simpleAdapter可以见于我的另外一篇文章http://www.blogjava.net/freeman1984/archive/2009/11/06/301475.html

public  class Test1  extends Activity  {
    ArrayList<HashMap<String, String>> users = new ArrayList<HashMap<String, String>>();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Button adduser = (Button)findViewById(R.id.Button01);
        adduser.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                Intent addnew = new Intent();
                addnew.setComponent(new ComponentName(Test1.this,Test2.class));
                startActivityForResult(addnew, 1);//通知打开新建用户界面 ,requestCode>0就行
            }
}
);
        initUser();//初始化界面上显示一个用户
        updateList();//显示列表
    }

    private void initUser() {
        HashMap<String, String> user = new HashMap<String, String>();
        user.put("name", "张三");
        user.put("phonenum", "tel:15842154687");
        users.add(user);
    }

    private void updateList() {
        SimpleAdapter saImageItems = new SimpleAdapter(this,
                users,// 数据来源
                R.layout.user,//每一个user xml 相当ListView的一个组件 
                new String[] {"name", "phonenum" },
                // 分别对应view 的id
                new int[] { R.id.name, R.id.phonenum});
        // 获取listview
        ((ListView) findViewById(R.id.userlist)).setAdapter(saImageItems);
    }


    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {//重写回调方法 将新用户添加到列表中,并刷新界面
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        Bundle newuser = data.getExtras();
        String name = newuser.getString("name");
        String phonenum = newuser.getString("phonenum");
        HashMap<String, String> user = new HashMap<String, String>();
        user.put("name", name);
        user.put("phonenum", "tel:"+phonenum);
        Log.d("Test1", "phonenum:"+phonenum);
        users.add(user);
        updateList();
    }

}

注意的不能在startActivityForResult(addnew, 1);后面finish();要不originating实例(列表activity)就不在了。
 新建用户activity Test2.java

public  class Test2  extends Activity  {
    /** Called when the activity is first created. */
    EditText newname;
    EditText newphone;
    Button submitbn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(android.R.style.Theme_Dialog);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newuser);
        setTitle("new User");
        newname = (EditText)findViewById(R.id.newname);
        newphone = (EditText)findViewById(R.id.newphone);
        submitbn = (Button)findViewById(R.id.submitbn);
        submitbn.setOnClickListener(new OnClickListener(){
        
            public void onClick(View v) {
                Intent submiti = new Intent();
                submiti.setComponent(new ComponentName(Test2.this,Test1.class));
                Bundle user = new Bundle();
                user.putString("name", newname.getText().toString());
                user.putString("phonenum", newphone.getText().toString());
                submiti.putExtras(user);
                setResult(RESULT_OK, submiti);//返回正确 
                finish();//此方法将会根据resultCode来处理如何关闭acticity
            }
}
);
        
        
    }

}


本文大致介绍了下显示的intent 将在下一篇中看看隐式的intent,也就是intent的其他成员变量的使用:intent主要的成员变量如下:
 

private String mAction;
     private Uri mData;
     private String mType;
     private ComponentName mComponent;
     private  int mFlags;
     private HashSet<String> mCategories;
     private Bundle mExtras;


本文来源:http://www.blogjava.net/freeman1984/archive/2009/11/10/301823.html

转载于:https://www.cnblogs.com/wuyihong/archive/2012/03/17/2403315.html

2009-01-18 Android应用协调器------Intent 关键字: android intent实例 刚起步的时候经常困扰我们的是一些本来容易解决的问题,往往我们会花掉很大的力气去找解决的办法,最后才知道原来这么简单,这就是英文世界造成的。 IntentAndroid应用开发中,占有很大的分量,关于IntentAndroid中的作用在网络上已经有很多资料了,这里不再累赘,本人喜欢直来直去。在网上看到很多关于Intent的资料,说那么多,你也许还是一头雾水,到底如何使用Intent呢?这里总结一些重用的Intent使用,仅供参考。 下面直接给我学习实例片段。 1,调用web浏览器 Uri myBlogUri = Uri.parse("http://kuikui.javaeye.com"); returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri); 2,地图 Uri mapUri = Uri.parse("geo:38.899533,-77.036476"); returnIt = new Intent(Intent.ACTION_VIEW, mapUri); 3,调拨打电话界面 Uri telUri = Uri.parse("tel:100861"); returnIt = new Intent(Intent.ACTION_DIAL, telUri); 4,直接拨打电话 Uri callUri = Uri.parse("tel:100861"); returnIt = new Intent(Intent.ACTION_CALL, callUri); 5,卸载 Uri uninstallUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); 6,安装 Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 7,播放 Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3"); returnIt = new Intent(Intent.ACTION_VIEW, playUri); 8,调用发邮件 Uri emailUri = Uri.parse("mailto:shenrenkui@gmail.com"); returnIt = new Intent(Intent.ACTION_SENDTO, emailUri); 9,发邮件 returnIt = new Intent(Intent.ACTION_SEND); String[] tos = { "shenrenkui@gmail.com" }; String[] ccs = { "shenrenkui@gmail.com" }; returnIt.putExtra(Intent.EXTRA_EMAIL, tos); returnIt.putExtra(Intent.EXTRA_CC, ccs); returnIt.putExtra(Intent.EXTRA_TEXT, "body"); returnIt.putExtra(Intent.EXTRA_SUBJECT, "subject"); returnIt.setType("message/rfc882"); Intent.createChooser(returnIt, "Choose Email Client"); 10,发短信 Uri smsUri = Uri.parse("tel:100861"); returnIt = new Intent(Intent.ACTION_VIEW, smsUri); returnIt.putExtra("sms_body", "shenrenkui"); returnIt.setType("vnd.android-dir/mms-sms"); 11,直接发邮件 Uri smsToUri = Uri.parse("smsto://100861"); returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri); returnIt.putExtra("sms_body", "shenrenkui"); 12,发彩信 Uri mmsUri = Uri.parse("content://media/external/images/media/23"); returnIt = new Intent(Intent.ACTION_SEND); returnIt.putExtra("sms_body", "shenrenkui"); returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri); returnIt.setType("image/png"); 用获取到的Intent直接调用startActivity(returnIt)就ok了。 今天就说这么多,有更大需求的可以看源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值