调用其它app的activity和让其它app调用你的activity的一些必要设置

来源:互联网 发布:做工瑕疵问题淘宝判罚 编辑:程序博客网 时间:2024/06/15 18:50

早上起来就逛别人博客,还真让我碰到了好东西。博客地址:点击打开链接

本文借助上面的博客连接的代码,并加以改动和总结。

测试一:

有时候我们的app需要调用其它的app的activity,下面就来实现一下:

根据具官方的说明,我们知道,需要在当前的activity中,建立一个模糊的意图,并使用startActivity方法发送出去。

// --------------------------------------打开web页面------------------------------Uri webpage = Uri.parse("http://www.android.com");Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);startActivity(webIntent);

还有一种方式就是,开启别的app中的activity后获取数据并将数据返回:

下面的代码参考官方的例子会更好理解:

// ==================================测试获取Activity返回的数据=========================private void pickContact() {// Create an intent to "pick" a contact, as defined by the content// provider URIIntent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);intent.setType(Phone.CONTENT_TYPE); //这一句很重要啊startActivityForResult(intent, PICK_CONTACT_REQUEST);}private void pickContact(String msg) {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT,msg);//文本内容startActivity(Intent.createChooser(intent, "nihao"));//弹出的选择程序处理的文字标题}//参考官方代码:http://developer.android.com/guide/components/activities.html@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    //检查响应的请求    if (requestCode == PICK_CONTACT_REQUEST) {        //确保请求是成功的        if (resultCode == RESULT_OK) {            // 获得指向选定联系人的URI            Uri contactUri = data.getData();            //我们只需要号码(NUMBER)列             String[] projection = {Phone.NUMBER};             // 在联系人中执行查询,获得NUMBER column            // 我们不需要挑选或排序            // 提示:  query()方法应该在单独的线程执行,避免阻塞UI线程            // 考虑使用CursorLoader 执行查询            Cursor cursor = getContentResolver()                    .query(contactUri, projection, null, null, null);            cursor.moveToFirst();             // 从NUMBER column中检索电话号码            int column = cursor.getColumnIndex(Phone.NUMBER);            String number = cursor.getString(column);             // 使用电话号码做些事情            makeToast(number);        }    }}// ==================================测试获取Activity返回的数据============结束=========================

不得不承认官方的代码我是没有调通的,根据博文修改了以后测试通过了。上面这个例子可以直接放在activity的代码中使用,调用pickContact()方法,作用是显示选择的联系人电话号码。

目的:开启另外一个app的activity获取数据后返回当前activity

操作:使用startActivityForResult() 代替 startActivity() 发送intent; 使用onActivityResult()方法接收处理返回的数据。

测试二:

将自己的activity开放出去供其它app的activity调用。

在AndroidManifest.xml添加”类似“下面的代码:

第一个intent-filter用于处理文本,第二个intent-filter用于处理图像。这里添加intent-filter就是申明你的activity能够处理什么类型的操作。其它操作的处理与之类似,具体intent_filter标签内的设置,参考官方文档和引用的博文。

    <intent-filter>        <action android:name="android.intent.action.SENDTO"/>        <category android:name="android.intent.category.DEFAULT"/>        <data android:scheme="sms" />        <data android:scheme="smsto" />    </intent-filter>        <intent-filter>        <action android:name="android.intent.action.SEND"/>        <category android:name="android.intent.category.DEFAULT"/>        <data android:mimeType="image/*"/>        <data android:mimeType="text/plain"/>    </intent-filter>
拥有以上的过滤器后当一个app的activity发起处理文本或者图像的请求时,你的这个activity就会被直接调用,但是前提是处理文本或图像的activity只有你这一个activity。如果又多个可以处理文本或者图像的activity,这时就会出现一个选择器供用户选择,你自己开放的activity会在这个选择器的列表中显示出来。

下面这段代码用于发送一个处理文本的请求:

Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT,msg);//文本内容startActivity(Intent.createChooser(intent, "nihao"));//弹出的选择程序处理的文字标题
以上代码用于测试开放的activity是否能被其它app 的activity调用,只需把上面的代码放在其它app 的activity中就可以了。

要在其它的activity接收传送过来的文本,可以再onCreate() or onStart()方法中添加以下代码(我没有测试成功,一直是空指针异常,先记录下来以后弄明白了再完善):

    //获得启动activity的intent    Intent intent = getIntent();    Uri data = intent.getData();     // 解决intent类型想做什么    if (intent.getType().indexOf("image/") != -1) {        //处理图像数据    } else if (intent.getType().equals("text/plain")) {        // 处理文本    }

调用和开放activity基本内容就这些了,值得深究的东西还有很多,本文也遇到不少问题,以后的学习过程中有了更深入的理解再做补充。