当前位置:   article > 正文

深入分析:Android中app之间的交互(一,使用Action)_android app的action

android app的action

问题引出

       

       在我们开发Android App应用的时候,有些需求需要我们启动其他的App来处理一些逻辑,例如我们需要根据一个地址来调用系统或者相关的地图Map App,这样我们不用在自己的App中编写相应的功能,而是通过Intent来发送一些请求,调用相关的应用来处理这些请求。并且我们称这种Intent为隐式的Intent;这种隐式的Intent是相对于显式的Intent来讲的。显式的Intent我们都比较熟悉,显式的Intent常常需要声明类的名称,而隐式的Intent我们需要声明一个Action,我们Action中定义了我们想要处理的请求。与Action相关联的还有data,例如我们需要查看的地址,或者我们需要拨打的电话号码,或者我们需要发送邮件的邮件地址等等。例如:

  1. Uri number = Uri.parse("tel:5551234");
  2. Intent callIntent = new Intent(Intent.ACTION_DIAL, number);



        上述代码中,我们通过startActivity()来调用Phone App,并进行拨打(5551234)的通话操作。

当然这里还有很多案例,这里主要是从API 文档中摘录的了。贴在这里供大家参考。


查看地图:

  1. // Map point based on address
  2. Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
  3. // Or map point based on latitude/longitude
  4. // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
  5. Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

浏览网页:

  1. Uri webpage = Uri.parse("http://www.android.com");
  2. Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

发送邮件:

  1. Intent emailIntent = new Intent(Intent.ACTION_SEND);
  2. // The intent does not have a URI, so declare the "text/plain" MIME type
  3. emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
  4. emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
  5. emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
  6. emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
  7. emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
  8. // You can also attach multiple items by passing an ArrayList of Uris


创建一个事件通知:

  1. Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
  2. Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
  3. Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
  4. calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
  5. calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
  6. calendarIntent.putExtra(Events.TITLE, "Ninja class");
  7. calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");


        此外,我们在定义我们的Intent的时候,要尽可能的详细,例如我们希望调用系统的图片查看器浏览图片,我们应该定义MIME type" image/*.",以防止会启动map app进行查看。而且如果没有app来响应我们的请求,我们的app就会崩溃。
        因此为了防止我们的app发送intent没有其他app来响应而导致应用异常退出,我们在发送intent前进行验证。为了验证是否有app的Activity来响应我们的Intent请求,我们需要调用queryIntentActivities()来进行验证。这个方法会返回一个list,我们通过判断list是否为空来验证,这样我们可以安全的使用Intent来实现不同App之间Activity的交互。如果没有响应的Acitivty来响应,我们可以提供一些链接给用户进行下载安装。验证方法如下:
       
  1. PackageManager packageManager = getPackageManager();
  2. List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
  3. boolean isIntentSafe = activities.size() > 0;


不同应用间的交互

下面我们通过具体的案例来使用隐式的Intent,使不同的App中的Activity进行交互。

首先我们创建第一个项目appsend,

我们创建一个按钮,并且在点击事件中创建Intent,并设置Action和type,并添加onActivityResult()来接收我们从第二个应用中返回的数据。

  1. public void button(View view) {
  2. Intent intent = new Intent();
  3. intent.setAction(Intent.ACTION_VIEW);
  4. intent.setType("test/");
  5. startActivityForResult(intent, 2);
  6. }
  7. @Override
  8. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  9. super.onActivityResult(requestCode, resultCode, data);
  10. switch (requestCode) {
  11. case 2:
  12. switch (resultCode) {
  13. case Activity.RESULT_OK:
  14. text.setText("URI:" + data.getDataString());
  15. break;
  16. }
  17. break;
  18. }
  19. }




第二步:我们创建第二个应用,并且在清单文件中进行配置Intent-filter;


  1. <activity
  2. android:name="com.example.appreceiver.MainActivity"
  3. android:label="@string/app_name" >
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. <intent-filter>
  9. <action android:name="android.intent.action.VIEW" />
  10. <data android:mimeType="test/*" />
  11. <category android:name="android.intent.category.DEFAULT" />
  12. </intent-filter>
  13. </activity>



第三步:在第二个Activity中监听返回按钮,并传回数据。


  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. switch (keyCode) {
  4. case KeyEvent.KEYCODE_BACK:
  5. Intent result = new Intent("com.example.appsend",
  6. Uri.parse("content://result_uri"));
  7. setResult(Activity.RESULT_OK, result);
  8. finish();
  9. break;
  10. }
  11. return super.onKeyDown(keyCode, event);
  12. }


具体案例下载地址为:http://download.csdn.net/detail/huangyabin001/7561309点击打开链接

原文地址:http://blog.csdn.net/huangyabin001/article/details/35265117


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/296600
推荐阅读
相关标签
  

闽ICP备14008679号