这一章来说,我们需要来使用隐式Intent,
在安卓系统中,可以利用隐式intent来启动其他应用的activity
如果在添加数据的时候,那么就得注意在数据库也需要修改,在写入和读取两方面都需要去修改。
为了创建消息模板的话,我们就可以在资源的string中去利用格式化字符串去创建模板消息
如下面的代码
<string name = "crime_report" > %1$s! The crimes is discovers on %2$s,and 3$s,and %4$s
%1$s,这些就是占位符,然后在代码间调用getString()方法,并传入格式化字符串的资源id和另外的字符串参数,与占位符的顺序要一样
如下面的代码
String report = getString(R.string.crime_report,mCrime.getTitle(),dataString,solvedString,suspect);
使用隐式Iinten那么只需要向操作系统发送要处理的任务,那么系统就会去处理它
一,下面是隐式intent的组成,(1)要执行的操作(2)待访问的数据的位置(3)操作涉及的数据类型(4)可以选择的类别(如何使用这个activity)
应该在配置文件中去填写某些过滤器,
由此下面我们来设置一个发送信息的隐式iintent
Intent i = new Intent(Intent.ACTION_SEND);//操作
i.setType("text/plain");//类型
i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());//内容
i.putExtra(Intent.EXTRA_SUBJECT,getString(R.string.crime_report_subject));
i = Intent.createChooser(i,getString(R.string.send_report));//下面的需求的代码
startActivity(i);
在上面,消息内容和主题是作为extra附加到intent上的,这些extra信息使用了Intent类中的常量,因此任何响应该intent的activity都知道这些常量,自然也就知道该如何去使用他们
在使用隐式intent时也可以创建每次都显示的activity选择器,和以前一样创建隐式intent后调用下面的方法并传入隐式intent和可以用作标题的字符串,如上面所加的代码,这样就会每次都显示可以选择的选择器
二.而如果通过隐式intent然后想要获得数据返回,那么我们就需要采用startActivityForResult()方法来传入intent和请求代码,如下面的代码:
private static final int REQUEST_CONTACT = 1;//请求代码的常量
//下面的代码就是使用隐式intent去访问联系人并要求获取联系人的姓名,
final Intent pickContact = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);//第一个参数是操作,第二个参数是联系人数据获取位置
startActivityForResult(pickContact,REQUEST_CONTACT);
三.安卓定制了一个ContentProvider类来封装联系人的数据库并提供给其他应用使用,我们可以通过ContentResolver来访问ContentProvider.前面我们使用了startActivityForResult()所以这边我们需要来调用onActivityResult()方法来接收到一个intent,这个intent包含了数据uri,这个数据uri指向了用户所选择的联系人,下面的代码在onActivityResult()方法中添加的:
if(resquestCode == REQUEST_CONTACT&&data !=null){
Uri contactUri = data.getData();//data是返回来的intent
String[] queryField = new String[] {
ContactsContract.Contacts.DISPLAY_NAME
};//用于确定我们想要返回的东西
Cursor c = getActivity().getContentResolver().query(contactUri,queryFileds,null,null,null);//在返回的uri数据里面查找我们需要查找的东西
try{
if(c.getCount()==0){
return;
}
c.moveToFirst();
String suspect = c.getString(0);
mCrime.setSuspect(suspect);
mSuspectButton.setText(suspect);
}finally{
c.close();
}
}
上面的代码是创建了一条查询语句,要求返回全部联系人的名字,然后查询联系人数据库,获得了一个可用的Cursor,这边因为知道cursor只有一条记录,所以将cursor移到第一条记录然后获取他们的字符串形式就是联系人的名,
这边联系人的使用权限是因为联系人应用把其的权限临时赋予给我们。
有时,如果操作系统没有找到联系人的应用,那么此时应用就会崩溃,那么此时就应该先通过操纵系统中的PackageManager类来进行自检,在onCreateView()方法中来实现检查,如下面的代码:
PackageManager packageManager = getActivity().getPackageManager();
if(packageManager.resolveActivity(pickContact,PackageManager.MATCH_DEFAUULT_ONLY) == null){
mSuspectButton.setEnabled(false);
}
上面的resolveActivity(Intent,int)方法是为了匹配给intent任务的activity,后面的flag是指只查找带有CATEGORY_DEFAULT标记的activity