在当前程序中调用其他程序的Activity

Feb 01, 2011

Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent作用的表现形式为:

  1. 通过Context.startActivity() or Activity.startActivityForResult() 启动一个Activity;
  2. 通过 Context.startService() 启动一个服务,或者通过Context.bindService() 和后台服务交互;
  3. 通过广播方法(比如 Context.sendBroadcast(),Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()) 发给broadcast receivers。

在代码中调用其他Activity我们可以通过intent的方式,通过限定参数格式的方式决定启用哪个注册了的Activity,一个利用intent实现文字共享的应用代码如下:

public class ShareViaIntent extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button mButton1 = (Button) findViewById(R.id.renren);
        mButton1.setOnClickListener(mShareRenren);
        Button mButton2 = (Button) findViewById(R.id.gmail);
        mButton2.setOnClickListener(mShareGmail);
        Button mButton3 = (Button) findViewById(R.id.sms);
        mButton3.setOnClickListener(mShareSMS);

        edittext = (EditText) findViewById(R.id.edittext);
        edittext.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                if ((event.getAction() == KeyEvent.ACTION_DOWN)
                        && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Perform action on key press
                    Toast.makeText(ShareViaIntent.this, edittext.getText(),
                            Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });
    };

    /*
     * 如果不对数据传输格式setType或者对附加信息puExtra作特殊说明,系统会自动罗列
     * 出一张经过android.content.Intent.ACTION_SEND过滤的程序表单,供用户选择
     * */
    private OnClickListener mShareRenren = new OnClickListener() {
        public void onClick(View v) {
            Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("text/plain");                                //确定数据格式                            
            share.putExtra(Intent.EXTRA_SUBJECT, "Title");    //添加附加信息
            share.putExtra(Intent.EXTRA_TEXT, edittext.getText().toString());
            startActivity(Intent.createChooser(share, "其他转发方式"));  
        }
    };

    /*对附加信息作了约束:
     * sendmail.putExtra(android.content.Intent.EXTRA_EMAIL,"default@wordsshare.com");  
     * sendmail.putExtra(android.content.Intent.EXTRA_TEXT, EmailBody);
     * 所以下述click事件对应的是发送邮件
     * */ 
    private OnClickListener mShareGmail = new OnClickListener() {
        public void onClick(View v) {
            Intent sendmail = new Intent(android.content.Intent.ACTION_SEND);
            sendmail.setType("plain/text");
            String EmailBody = edittext.getText().toString();
            sendmail.putExtra(android.content.Intent.EXTRA_EMAIL,
                     "default@wordsshare.com"); 
            sendmail.putExtra(android.content.Intent.EXTRA_TEXT, EmailBody); 
            startActivity(Intent.createChooser(sendmail, getResources()
                    .getString(R.string.viaGmail)));
        }
    };

    /*对数据格式和附加信息作了约束:
     * sendSMS.putExtra("sms_body", edittext.getText().toString());    
     *      sendSMS.setType("vnd.android-dir/mms-sms"); 
     *所以下述click对应的事件是发送短信 
     * */
    private OnClickListener mShareSMS= new OnClickListener() {
        public void onClick(View v) {
            Intent sendSMS = new Intent(Intent.ACTION_VIEW);    
            sendSMS.putExtra("sms_body", edittext.getText().toString());    
            sendSMS.setType("vnd.android-dir/mms-sms");    
            startActivity(sendSMS); 
        }
    };

    public EditText edittext;
}

然而通过intent+component name的方式我们可以直接指定调用哪一个包或者程序的哪个Activity:

Intent intent = new Intent(Intent.ACTION_MAIN); 
ComponentName componentName = new ComponentName("包名", "activity名");
intent.setComponent(componentName);  
startActivity(intent);  

点击查看更多关于intent机制的详细资料

Comments

  1. 博客很漂亮:)支持下 :xia:

    Avatar

Get In Touch With Us ...