• 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

  • 相关阅读:
    测试clang-format的格式化效果
    debian设置limits.conf
    可读性公式的python包+MLTD讲解
    SQL-1
    首届中文NL2SQL挑战赛-step7记录
    首届中文NL2SQL挑战赛-step6
    torch学习中的难点
    yield and send的使用详细解释
    ELMO及前期工作 and Transformer及相关论文
    LSTM参数和结构的本质理解——num_units参数/batch_size/cell计算
  • 原文地址:https://www.cnblogs.com/wuyihong/p/2403315.html
Copyright © 2020-2023  润新知