intent—意图
作用:
- 用于应用程序之间,协调应用之间的通讯和交互
- 用于应用程序内部交互,可以携带一次操作的动作,以及动作涉及的数据,附加数据等信息
- ConmponentName:组件名
- Action:动作
- Data:数据
- Extras:类型
- Extras:附加信息
- Category:类别
- Flag:标志
ComponentName:组件名,指定目标类名,用来处理intent的匹配问题。可不设置,设置了的intent叫显式intent没有设置的intent叫隐式intent
Action:动作,描述intent的动作,intent类中定义了一系列的意图动作
Data:数据,intent要操作的数据,Android中用指定一个URI来表示ACTION_CALL activity 启动一个电话.ACTION_SENDTO activity 发短信.ACTION_VIEW activity 打开页面.ACTION_EDIT activity 显示用户编辑的数据.ACTION_MAIN activity 作为Task中第一个Activity启动ACTION_SYNC activity 同步手机与数据服务器上的数据.ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.
tel:// 打电话 tel://10086smsto:// 发短信 smsto://10086http:// 打开网页file:/// 打开本地文件 file:///mnt/sdcard/mp3/a.mp3mailto:// 电子邮件,后接收件人地址 mailto://xxx@163.comgeo:// 地理位置信息,后接经纬度content:// 内容,后接内容的定位 content://contacts/people/1
Extras:附加信息,用来传值,一种键值对结构intent.setDataAndType(URI data,String type);
intent.putExtra("key",value);
Category:类别,被执行动作的附加信息,一般被设置在IntentFilter中
CATEGORY_LAUNCHER 表示Intent 的接受者应该在Launcher中作为顶级应用出现
CATEGORY_DEFAULT 默认的,Android系统会给隐式Intent自动加上这个值CATEGORY_HOME 显示Home界面的Activity,可以使用这个常量来显示Home界面CATEGORY_BROWSABLE 目标Activity可以被浏览器使用超链接触发,并能显示相应数据
Flags:标志位,多用于Task和Activity栈的处理中
可以通过不同的Flags来告诉系统,Activity属于那个Task
一个Activity被启动或停止后在Activity栈中的位置如何改变等
用Action,Data、Type,Category去描述一个意图
部分系统调用,以下代码在荣耀H60-L11测试通过
package com.ztt.android_intent;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity
{
private Context context;
private ImageView imgView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = MainActivity.this;
imgView = (ImageView) findViewById(R.id.main_img);
}
// 打开网页
public void onClick_view(View view)
{
Intent intent = new Intent();
Uri uri = Uri.parse("http://www.baidu.com");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
}
// 打开拨号键盘
public void onClick_opentel(View view)
{
Uri uri = Uri.parse("tel:10086");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
}
// 拨出号码,需要添加权限:<uses-permission android:name="android.permission.CALL_PHONE"
// />
public void onClick_tel(View view)
{
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
}
// 打开短信 并指定号码和内容
public void onClick_sms(View view)
{
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.putExtra("sms_body", "1");
intent.setData(Uri.parse("smsto:10086"));
startActivity(intent);
}
// 发送短信
public void onClick_sendSms(View view)
{
String phoneNumber = "10086";
String smsBody = "1";
SmsManager mSmsManager = SmsManager.getDefault();
/*
* 处理返回的发送状态
*/
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
Intent sentIntent = new Intent(SENT_SMS_ACTION);
PendingIntent sendIntent = PendingIntent.getBroadcast(context, 0,
sentIntent, 0);
context.registerReceiver(new BroadcastReceiver()
{
@Override
public void onReceive(Context _context, Intent _intent)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT)
.show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
case SmsManager.RESULT_ERROR_RADIO_OFF:
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(context, "短信发送失败", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT_SMS_ACTION));
/*
* 处理返回的接收状态
*/
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
PendingIntent backIntent = PendingIntent.getBroadcast(context, 0,
deliverIntent, 0);
context.registerReceiver(new BroadcastReceiver()
{
@Override
public void onReceive(Context _context, Intent _intent)
{
Toast.makeText(context, "收信人已经成功接收", Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(DELIVERED_SMS_ACTION));
// 短信长度限制,达到上限自动分割
List<String> divideContents = mSmsManager.divideMessage(smsBody);
for (String text : divideContents)
{
// 五个参数
// 1、接收信息号码2、服务中心地址,设为null使用短信中的3、信息内容4、发送响应报告,不需要则设为null5、对方接收响应报告,不需要则设为null
mSmsManager.sendTextMessage(phoneNumber, null, text, sendIntent,
backIntent);
}
}
// 卸载软件
public void onClick_uninstall(View view)
{
Uri uri = Uri.fromParts("package", "com.ztt.android_activity", null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);
}
// 安装软件
public void onClick_install(View view)
{
String str = "/software/jsq.apk";
String fileName = Environment.getExternalStorageDirectory() + str;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)),
"application/vnd.android.package-archive");
startActivity(intent);
}
// 打开应用
public void onClick_pen(View view)
{
String packageName = "com.ztt.android_activity";
PackageInfo packageInfo = null;
if (checkApkExist(context, packageName))// 判断此应用是否正确安装
{
try
{
packageInfo = getPackageManager().getPackageInfo(packageName, 0);
} catch (NameNotFoundException e)
{
e.printStackTrace();
}
}else {
Toast.makeText(context, "没有安装此程序", 0).show();
return;
}
Intent resolveIntent = new Intent();
resolveIntent.setAction(Intent.ACTION_MAIN);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageInfo.packageName);
// 根据intent筛选Activity
List<ResolveInfo> resolveinfoList = getPackageManager().queryIntentActivities(resolveIntent, PackageManager. GET_INTENT_FILTERS);
ResolveInfo resolveinfo = resolveinfoList.iterator().next();
if (resolveinfo != null)
{
// 获取到MainActivity的名字
String className = resolveinfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// 设置ComponentName参数1:要启动程序的packagename2:要启动程序的MainActivity
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
}
}
/**
* @Title: checkApkExist
* @Description: 判断应用是否安装
*/
public boolean checkApkExist(Context context, String packageName)
{
if (packageName == null || "".equals(packageName))
return false;
try
{
ApplicationInfo info = context.getPackageManager()
.getApplicationInfo(packageName,PackageManager.GET_UNINSTALLED_PACKAGES);
return true;
} catch (NameNotFoundException e)
{
return false;
}
}
// 打开相机
public void onClick_c(View view)
{
// 打开相册
// Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
public void onClick_photo(View view)
{
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
{
case 1:
if (resultCode == Activity.RESULT_OK)
{
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
imgView.setImageBitmap(bitmap);
}
break;
case 2:
if (resultCode == Activity.RESULT_OK)
{
Uri uri = data.getData();
Bitmap bitmap;
try
{
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri));
imgView.setImageBitmap(bitmap);
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
break;
}
}
}
代码下载