android 最重要的特征之一就是允许你通过action 将你的用户发送到其他app,比如说 你的聊天应用里面 需要读取聊天内容里面的地址的时候,你不需要为了读取里面的地址而专门写map activity,只需要通过Intent 对象 将地址发送到 已有的地图 应用里面 就可以了。
1.创建一个隐式Intent :不需要声明class 只需要声明 action
例:Uri number=Uri.parse("tel:5551234");
Intent callIntent=newIntent(Intent.ACTION_DIAL, number);
这样在程序开始的时候 手机就会拨打 这个电话号码:
例:查看地址view
// Map point based on address Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); // Or map point based on latitude/longitude // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);例:访问web'page
Uri webpage = Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);为了确保有程序回去响应你的intent 可以调用
queryIntentActivities()
PackageManager packageManager = getPackageManager()
;
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
当然你也可以指定一个app去响应 你的intent
当系统中有多个app可以响应你的intent的时候,可以弹出一个dialog 让用户选择一个app去响应,当只有一个的时候 会立即打开这个app
完整实例:
// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
// Verify it resolves
PackageManager packageManager = getPackageManager()
;
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;
// Start an activity if it's safe
if (isIntentSafe) {
startActivity(mapIntent);
}
创建选择器:
Intent intent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. This says something like "Share this photo with" String title = getResources().getText(R.string.chooser_title); // Create and start the chooser Intent chooser = Intent.createChooser(intent, title); startActivity(chooser);
2.让其他的app可以打开你的app 声明一个 intentfilter
接收action :ndroid.intent.action.SEND 接收的date 类型包括text 和 image 为了接收隐式intent 必须加上 category default
在你的activity里面去处理传进来的参数 并返回result
<activity android:name="ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
<activity android:name="ShareActivity"> <!-- filter for sending text; accepts SENDTO action with sms URI schemes --> <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> <!-- filter for sending text or images; accepts SEND action and text or image data --> <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> </activity>
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data ... } else if (intent.getType().equals("text/plain")) { // Handle intents with text ... } }
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"); setResult(Activity.RESULT_OK, result); finish();无需检查是startActivity或者 startActivityForResult(),如果不是startActivityForResult 会无视setresult 否则会将结果返回。