案例 名片注册
一、案例描述
1、考核知识点
01003001:Activity的创建
01003002:Activity的生命周期
01003008:数据传递方式
2、练习目标
Ø 掌握如何开启新的Activity
Ø 掌握如何在两个Activity之间传递数据
3、需求分析
Android应用通常是由多个Activity组成,这些Activity用于显示不同的页面,它们之间是相互独立的,但是经常需要在不同的界面之间传递数据,例如第一个页面注册信息后,将信息显示到第二个页面上面。
4、设计思路(实现原理)
1)创建第一个Activity,用于输入注册信息,将信息传递给第二个Activity。
2)创建第二个Activity,接收第一个Activity传递的信息,将信息显示在页面上面。
二、案例实现
(1)创建名片注册程序
创建一个名为“名片注册”的程序,该程序用于填写并发送注册信息。程序主界面如图3-1所示。

图3-1 数据传递页面
“名片注册”程序对应的布局文件如下所示:
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/cz_bj"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn_regist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="40dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/cz_shade_button"
android:onClick="register"
android:text="注册新用户"
android:textColor="#ffffff" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/btn_regist"
android:layout_marginBottom="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rl_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/cz_shade_ll" >
<EditText
android:id="@+id/edtTxt_number"
style="@style/edtTxtStyle"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/tv_number"
android:ems="10"
android:inputType="number" />
<TextView
android:id="@+id/tv_number"
style="@style/tvStyle"
android:layout_centerVertical="true"
android:text="手机号码:" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_nickName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@drawable/cz_shade_ll" >
<EditText
android:id="@+id/edtTxt_nickName"
style="@style/edtTxtStyle"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/tv_number"
android:ems="10" />
<TextView
android:id="@+id/tv_number"
style="@style/tvStyle"
android:text="昵称 :"
android:textColor="#000000" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
接下来将TextView和EditText的属性抽取出做单独样式,存放在res/values目录下的styles.xml文件内,TextView和EditText的样式如下所示:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppBaseTheme"parent="android:Theme.Light">
</style>
<style name="AppTheme" parent="AppBaseTheme">
</style>
<style name="tvStyle"parent="android:Widget.Holo.Light.TextView">
<itemname="android:layout_marginBottom">20dp</item>
<item name="android:layout_marginLeft">5dp</item>
<item name="android:layout_marginRight">5dp</item>
<item name="android:layout_marginTop">20dp</item>
<item name="android:layout_width">wrap_content</item>
<itemname="android:layout_height">wrap_content</item>
<itemname="android:layout_centerVertical">true</item>
<item name="android:textSize">16dp</item>
</style>
<style name="edtTxtStyle"parent="android:Widget.Holo.Light.EditText">
<item name="android:background">@null</item>
<item name="android:layout_marginRight">5dp</item>
<itemname="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
</resources>
(2)编写MainActivity逻辑代码
MainActivity中填写完注册信息后使用Intent将信息发送到第二个Activity中。具体代码如下所示:
1 public class MainActivityextends Activity {
2 private EditText edtTxt_number, edtTxt_nickName;
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_main);
7 initView();
8 }
9
10 private void initView() {
11 edtTxt_number = (EditText) findViewById(R.id.edtTxt_number);
12 edtTxt_nickName = (EditText)findViewById(R.id.edtTxt_nickName);
13
14 }
15
16 public void register(View view) {
17 String number = edtTxt_number.getText().toString().trim();
18 String nickName = edtTxt_nickName.getText().toString().trim();
19 if (TextUtils.isEmpty(number) || TextUtils.isEmpty(nickName)){
20 Toast.makeText(this, "选项不能为空", 0).show();
21 return;
22 }
23 Intent intent = new Intent(this, SecondActivity.class);
24 // 意图如何传递数据,信封邮包
25 intent.putExtra("number", number);
26 intent.putExtra("nickName", nickName);
27 startActivity(intent);
28 }
29 }
(3)创建第二个Activity
接下来创建第二个Activity起名称为SecondActivity,在清单文件中注册,该Activity用于接收第一个Activity传递过来的数据并显示在界面上,SecondActivity的布局视图如3-2所示。

图3-2 SecondActivity界面
activity_second.xml所对应布局文件如下所示:
1 <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context=".MainActivity">
6 <ImageView
7 android:id="@+id/iv_head"
8 android:layout_width="50dp"
9 android:layout_height="50dp"
10 android:layout_marginLeft="20dp"
11 android:layout_marginTop="30dp"
12 android:src="@drawable/cz_head"/>
13 <TextView
14 android:id="@+id/tv_nickname"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:layout_alignTop="@+id/iv_head"
18 android:layout_marginLeft="21dp"
19 android:layout_toRightOf="@+id/iv_head"
20 android:text="昵称:"
21 android:textSize="18dp" />
22 <TextView
23 android:id="@+id/tv_numberShow"
24 android:layout_width="wrap_content"
25 android:layout_height="wrap_content"
26 android:layout_alignBottom="@+id/iv_head"
27 android:layout_alignLeft="@+id/tv_nickname"
28 android:text="手机:"
29 android:textSize="18dp" />
30 <TextView
31 android:id="@+id/tv_hobby"
32 android:layout_width="wrap_content"
33 android:layout_height="wrap_content"
34 android:layout_alignParentLeft="true"
35 android:layout_below="@+id/iv_head"
36 android:layout_marginLeft="21dp"
37 android:layout_marginTop="16dp"
38 android:text="爱好 :约会"
39 android:textSize="20dp" />
40 <TextView
41 android:id="@+id/tv_gender"
42 android:layout_width="wrap_content"
43 android:layout_height="wrap_content"
44 android:layout_alignLeft="@+id/tv_hobby"
45 android:layout_below="@+id/tv_hobby"
46 android:layout_marginTop="16dp"
47 android:text="性别 :暂定"
48 android:textSize="20dp" />
49 <TextView
50 android:id="@+id/tv_introduction"
51 android:layout_width="wrap_content"
52 android:layout_height="wrap_content"
53 android:layout_alignLeft="@+id/tv_gender"
54 android:layout_below="@+id/tv_gender"
55 android:layout_marginBottom="30dp"
56 android:layout_marginTop="16dp"
57 android:text="自我介绍:"
58 android:textSize="20dp" />
59 </RelativeLayout>
(4)编写SecondActivity逻辑代码
在SecondActivity的onCreate()方法中使用getIntent()接收从前一个Activity传递过来的数据,根据key值取出相应的values,并把取出的值显示在界面上。
public class SecondActivity extends Activity {
privateTextView tv_number, tv_nickName;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
initView();
Intentintent = getIntent();
Stringnumber = intent.getStringExtra("number");
StringnickName = intent.getStringExtra("nickName");
tv_number.setText("电话号码:" + number);
tv_nickName.setText("昵称:" + nickName + "(火星)");
}
privatevoid initView() {
tv_number= (TextView) findViewById(R.id.tv_numberShow);
tv_nickName= (TextView) findViewById(R.id.tv_nickname);
}
}
(5)运行程序
运行“名片注册”程序,首先显示主界面MainActivity,如图3-3的左图所示,在界面中填写了手机号码和昵称,点击注册新用户按钮后如图3-3的右图所示,第二个界面接收并显示出了输入的信息。

图3-3 Activity间传递数据
三、案例总结
1、Activity必须在清单文件中注册,注册节点为<activity>。
2、Activity之间的跳转和传输数据使用Intent。
案例3-2 新建联系人
一、案例描述
1、考核知识点
01003010:回传数据
01003006:显示意图和隐式意图
2、练习目标
Ø 掌握Activity之间回传数据的功能
Ø 掌握Activity隐式意图的使用
3、需求分析
在Android系统中,不仅需要把数据传递给不同页面,也经常会打开一个新的页面,把新页面中的数据回传给调用者。传递数据与回传数据同样使用的都是Intent对象。
4、设计思路(实现原理)
1) 创建主界面MainActivity,该Activity有一个Button按钮,点击进入第二个页面并将第二个页面的数据显示在界面上。
2) 创建第二个界面SecondActivity,该Activity主要用于输入信息、从图库选择图片并将数据回传给MainActivity。
二、案例实现
(1)新建联系人程序
创建“新建联系人”程序,首先创建第一个Activity用于显示信息,该程序的界面如图3-4所示。

图3-4 主界面
主界面对应的布局文件(activity_main)如下所示:
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp" >
<ImageView
android:id="@+id/ic_head"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_email"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_phone"
android:layout_below="@+id/tv_phone"
android:layout_marginTop="15dp"
android:text="email:"
android:textSize="18dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/ic_head"
android:layout_marginBottom="21dp"
android:layout_marginLeft="14dp"
android:layout_toRightOf="@+id/ic_head"
android:text="姓名"
android:textSize="18dp" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ic_head"
android:layout_marginTop="22dp"
android:text="电话:"
android:textSize="18dp" />
</RelativeLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="22dp"
android:onClick="click"
android:text="新建联系人" />
</RelativeLayout>
MainActivity的代码如下所示:
1 public class MainActivityextends Activity {
2 private TextView tv_name, tv_email, tv_phone;
3 private ImageView iv_head;
4 private String name;
5 private String email;
6 private byte[] imageByte;
7 private Bitmap bitmap;
8 private String phone_et;
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.activity_main);
13
14 tv_name = (TextView) findViewById(R.id.tv_name);
15 tv_email = (TextView) findViewById(R.id.tv_email);
16 tv_phone = (TextView) findViewById(R.id.tv_phone);
17 iv_head = (ImageView) findViewById(R.id.iv_head);
18 }
19 public void click(View view) {
20 Intent intent = new Intent(this, SecondActivity.class);
21 startActivityForResult(intent, 1);
22 }
23 @Override
24 protected void onActivityResult(int requestCode, int resultCode,
25 Intent data) {
26 super.onActivityResult(requestCode, resultCode, data);
27 if (data != null) {
28 if (resultCode == 1) {
29 if (requestCode == 1) {
30 try {
31 name = data.getStringExtra("name");
32 email = data.getStringExtra("email");
33 phone_et =data.getStringExtra("phone");
34 imageByte =data.getByteArrayExtra("image");
35 bitmap =BitmapFactory.decodeByteArray(imageByte,
36 0, imageByte.length);
37 } catch (Exception e) {
38 }
39 if (name != null) {
40 tv_name.setText("姓名 :"+ name);
41 }
42 if (email != null) {
43 tv_email.setText("email :" + email);
44 }
45 if (phone_et != null) {
46 tv_phone.setText("电话号码 :"+ phone_et);
47 }
48 if (bitmap != null) {
49 iv_head.setImageBitmap(bitmap);
50 }
51 }
52 }
53 }
54 }
55 }
创建SecondActivity类的布局activity_second.xml,该布局包含四个EditText ,second.xml所对应界面如图3-5所示。

图3-5 选择联系人界面
activity_second.xml布局文件如下所示:
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rl_head"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0EDE5" >
<TextView
android:id="@+id/tv_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:text="新建联系人"
android:textColor="#86743f" />
<View
style="@style/view_wire"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tv_head" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/rl_head"
android:background="#e6e6e6" >
<ImageView
android:id="@+id/iv_select"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginTop="10dp"
android:paddingBottom="10dp"
android:src="@drawable/ic_launcher" />
<EditText
android:id="@+id/et_company"
style="@style/edtTxtStyle"
android:layout_alignBottom="@+id/iv_select"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@+id/iv_select"
android:ems="10"
android:hint="公司或标签" />
<EditText
android:id="@+id/et_name"
style="@style/edtTxtStyle"
android:layout_alignLeft="@+id/et_company"
android:layout_alignTop="@+id/iv_select"
android:ems="10"
android:hint="姓名">
<requestFocus />
</EditText>
<View
style="@style/view_wire"
android:layout_alignLeft="@+id/et_name"
android:layout_centerVertical="true" />
</RelativeLayout>
<View
android:id="@+id/view_wire3"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tv_telephoneHint"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="#e3e0d8" />
<TextView
android:id="@+id/tv_telephoneHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/rl_user"
android:layout_marginLeft="18dp"
android:layout_marginTop="20dp"
android:text="电话"/>
<TextView
android:id="@+id/tv_phoneHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/view_wire3"
android:layout_marginLeft="18dp"
android:layout_marginTop="20dp"
android:text="手机 :" />
<View
android:id="@+id/view_wire4"
style="@style/view_wire"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tv_emailHint"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp" />
<TextView
android:id="@+id/tv_emailHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tv_phoneHint"
android:layout_marginLeft="18dp"
android:layout_marginTop="30dp"
android:text="邮箱"/>
<TextView
android:id="@+id/tv_firmHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/view_wire4"
android:layout_marginLeft="18dp"
android:layout_marginTop="20dp"
android:text="公司 :" />
<EditText
android:id="@+id/et_email"
style="@style/edtTxtStyle"
android:layout_alignBottom="@+id/tv_firmHint"
android:layout_alignLeft="@+id/et_phone"
android:ems="10"
android:hint="电子邮件"
android:inputType="textEmailAddress" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="#000000" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="25dp"
android:layout_marginTop="20dp"
android:onClick="complete"
android:text="完成"
android:textSize="18dp" />
</RelativeLayout>
<EditText
android:id="@+id/et_phone"
style="@style/edtTxtStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/tv_phoneHint"
android:layout_alignRight="@+id/view_wire3"
android:ems="10"
android:hint="电话号码"
android:inputType="phone" />
</RelativeLayout>
其中View和EditText的属性抽取出做单独样式,如下所示:
<style name="edtTxtStyle"parent="android:Widget.Holo.Light.EditText">
<item name="android:background">@null</item>
<itemname="android:layout_width">wrap_content</item>
<itemname="android:layout_height">wrap_content</item>
</style>
<style name="view_wire">
<item name="android:background">#e3e0d8</item>
<itemname="android:layout_width">match_parent</item>
<item name="android:layout_height">1dp</item>
</style>
(3)SecondActivity类
创建好联系人信息界面后创建一个SecondAcitivty.java,该类主要完成信息的输入、图片选择和数据的回传功能:
public class SecondActivity extends Activity {
privateEditText et_name, et_phone, et_email;
privateImageView select_ico;
privatebyte[] bitmapToBytes;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
et_name= (EditText) findViewById(R.id.et_name);
et_phone= (EditText) findViewById(R.id.et_phone);
et_email= (EditText) findViewById(R.id.et_email);
select_ico= (ImageView) findViewById(R.id.iv_select);
select_ico.setOnClickListener(newOnClickListener() {
@Override
publicvoid onClick(View v) {
Intenti = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i,1);
}
});
}
publicvoid complete(View view) {
Stringname = et_name.getText().toString().trim();
Stringphone = et_phone.getText().toString().trim();
Stringemail = et_email.getText().toString().trim();
Intentintent = new Intent();
intent.putExtra("name",name);
intent.putExtra("phone",phone);
intent.putExtra("email",email);
intent.putExtra("image",bitmapToBytes);
setResult(1,intent);
this.finish();
}
privatebyte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStreambaos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG,100, baos);
returnbaos.toByteArray();
}
@Override
protectedvoid onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode,resultCode, data);
if(requestCode == 1 && resultCode == RESULT_OK && null != data) {
UriselectedImage = data.getData();
String[]filePathColumn = { MediaStore.Images.Media.DATA };
Cursorcursor = getContentResolver().query(selectedImage,
filePathColumn,null, null, null);
cursor.moveToFirst();
intcolumnIndex = cursor.getColumnIndex(filePathColumn[0]);
StringpicturePath = cursor.getString(columnIndex);
cursor.close();
select_ico.setImageBitmap(BitmapFactory.decodeFile(picturePath));
Bitmapimage = ((BitmapDrawable) select_ico.getDrawable())
.getBitmap();
bitmapToBytes= Bitmap2Bytes(image);
}
}
}
(3)运行程序
运行“新建联系人”程序,结果如图3-6所示。

图3-6 主界面
点击新建联系人按钮,打开输入信息界面并输入姓名、公司、电话号码、电子邮件并点击头像进入系统图库选择一张图片,如图3-7的左图所示。填写之后点击完成按钮将数据回传给MainActivity,如图3-7的右图所示。

图3-7 Activity回传数据
三、案例总结
1、使用Activity回传数据需要用到startActivityForResult打开新的Activity。
2、回传数据界面需要设置setResult();方法设置结果数据并指定数据存放在Intent对象中。
案例3-3 应用的打开和卸载
一、案例描述
1、考核知识点
01003006:显示意图和隐式意图
2、练习目标
Ø 掌握显示和隐式Intent的使用
3、需求分析
使用Android设备经常需要涉及应用的启动、安装、卸载功能,实现这些功能的组件就是Intent。通过显示意图设置应用的应用名称、包名就可以进行启动程序,通过隐式意图设置动作可以对其他应用进行安装和卸载。
4、设计思路(实现原理)
1)创建一个类MainActivity,该类中主要处理应用信息的显示、点击图标弹出对话框进行应用的打开和卸载操作。
二、案例实现
(1)创建应用的打开和卸载程序
创建MainActivity用于搜索手机中安装的应用并把两个Demo程序显示在界面上,点击应用图标可以进行打开和卸载。该类的界面如图3-8所示。

图3-8 主界面
主界面对应的布局文件如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/rl_secondUse"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginBottom="183dp">
<ImageView
android:id="@+id/iv_secondIco"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="40dp"
android:src="@drawable/ic_launcher"
/>
<TextView
android:id="@+id/tv_SecondPackName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/tv_secondName"
android:text="第二个应用包名" />
<TextView
android:id="@+id/tv_secondName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:layout_toRightOf="@+id/iv_secondIco"
android:text="第二个应用" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_firstUse"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/rl_secondUse"
android:layout_marginBottom="20dp"
android:layout_alignParentLeft="true">
<ImageView
android:id="@+id/iv_firstIco"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="40dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv_firstUseHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:layout_toRightOf="@+id/iv_firstIco"
android:text="第一个应用" />
<TextView
android:id="@+id/tv_firstPackageHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="21dp"
android:layout_toRightOf="@+id/tv_firstUseHint"
android:text="第一个应用包名" />
</RelativeLayout>
</RelativeLayout>
在编写主界面逻辑之前为了更好的实验利用Intent对应用进行打开和卸载功能,要先创建两个Demo程序:cn.itcast.demo1和cn.itcast.demo2,并为这两个程序替换不同的应用图标。先把这两个Demo程序安装在模拟器或者真实设备中,然后编写主程序的逻辑。之后主程序对应用的打开和卸载功能都是围绕这两个Demo进行。
(2)编写主界面逻辑
编写主逻辑代码,该类中主要实现搜索设备中安装所有应用,如果Demo程序安装则显示在界面上,点击之后弹出对话框进行打开和卸载操作。
public class MainActivity extends Activity implementsOnClickListener {
private TextView tv_firstName, tv_secondPackageName, tv_secondName,
tv_firstPackageName;
privateImageView iv_firstIco, iv_secondIco;
privatePackageManager packageManager;
privateRelativeLayout rl_firstUse, rl_secondUse;
private booleanfirst_isExist, second_isExist;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_firstName= (TextView) findViewById(R.id.tv_firstUseHint);
tv_secondPackageName= (TextView) findViewById(R.id.tv_SecondPackName);
tv_secondName= (TextView) findViewById(R.id.tv_secondName);
tv_firstPackageName= (TextView) findViewById(R.id.tv_firstPackageHint);
iv_firstIco= (ImageView) findViewById(R.id.iv_firstIco);
iv_secondIco= (ImageView) findViewById(R.id.iv_secondIco);
rl_firstUse= (RelativeLayout) findViewById(R.id.rl_firstUse);
rl_secondUse= (RelativeLayout) findViewById(R.id.rl_secondUse);
rl_firstUse.setOnClickListener(this);
rl_secondUse.setOnClickListener(this);
}
@Override
protectedvoid onResume() {
super.onResume();
packageUtils();
isExistFlag(first_isExist,rl_firstUse);
isExistFlag(second_isExist,rl_secondUse);
}
private voidisExistFlag(boolean flag, RelativeLayout rl) {
if(!flag) {
rl.setVisibility(View.GONE);
} else{
rl.setVisibility(View.VISIBLE);
}
}
@Override
protectedvoid onPause() {
super.onPause();
first_isExist= false;
second_isExist= false;
}
@SuppressLint("NewApi")
private voidpackageUtils() {
packageManager= this.getPackageManager();
List<PackageInfo>packageInfoList = packageManager
.getInstalledPackages(0);
for (inti = 0; i < packageInfoList.size(); i++) {
PackageInfopak = (PackageInfo) packageInfoList.get(i);
if((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0)
{
if(pak.packageName.equals("cn.itcast.demo1")) {
setData(pak,tv_firstName, tv_firstPackageName, iv_firstIco);
first_isExist= true;
}else if (pak.packageName.equals("cn.itcast.demo2")) {
setData(pak,tv_secondName, tv_secondPackageName, iv_secondIco);
second_isExist= true;
}
}
}
}
private voidsetData(PackageInfo pak, TextView name, TextView pakName,
ImageViewiv) {
name.setText(packageManager.getApplicationLabel(pak.applicationInfo));
pakName.setText(pak.packageName);
DrawableapplicationIcon = packageManager
.getApplicationIcon(pak.applicationInfo);
iv.setImageBitmap(drawableToBitmap(applicationIcon));
}
private voidopenFile(String name, String pakName) {
try {
Intentintent = new Intent();
intent.setComponent(newComponentName(name, pakName));
startActivity(intent);
} catch(Exception e) {
}
}
public staticBitmap drawableToBitmap(Drawable drawable) {
Bitmapbitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity()!= PixelFormat.OPAQUE ?
Bitmap.Config.ARGB_8888
:Bitmap.Config.RGB_565);
Canvascanvas = new Canvas(bitmap);
drawable.setBounds(0,0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawable.draw(canvas);
returnbitmap;
}
@Override
public voidonClick(View v) {
switch(v.getId()) {
caseR.id.rl_firstUse:
dialog("cn.itcast.demo1","cn.itcast.demo1.MainActivity");
break;
caseR.id.rl_secondUse:
dialog("cn.itcast.demo2","cn.itcast.demo2.MainActivity");
break;
default:
break;
}
}
private voiddialog(final String name, final String pakName) {
AlertDialog.Builderbuilder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("选项");
builder.setPositiveButton("打开应用",
newDialogInterface.OnClickListener() {
@Override
publicvoid onClick(DialogInterface dialog, int which) {
openFile(name,pakName);
}
});
builder.setNegativeButton("卸载应用",
newDialogInterface.OnClickListener() {
@Override
publicvoid onClick(DialogInterface dialog, int which) {
uninstall(name);
}
});
builder.create().show();
}
private voiduninstall(String name) {
UripackageURI = Uri.parse("package:" + name);
IntentuninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);
}
}
上述代码中packageUtils()方法是扫描手机中安装的所有应用,并把两个Demo程序显示在界面中。setData()方法是为控件设置数据;drawableToBitmap()方法是把Drawable格式图片转换成Bitmap格式,为了把图片放入ImageView控件当中;openFile()方法是使用显示Intent打开应用;uninstall()方法是使用隐式Intent卸载应用。
(3) 运行程序
首先安装Demo程序,再运行打开和卸载程序,如图3-9所示。

图3-9 主界面
当“安装卸载应用”程序打开后搜索设备中安装的所有应用,由于事先将两个Demo程序安装在设备中,因此将两个程序显示在界面上并显示出应用图标、应用名称和应用包名,点击Demo1,如图3-10所示。

图3-10 点击Demo1弹出对话框并点击卸载
如图3-10的左图所示,点击Demo1弹出了对话框,有两个选项:卸载应用和打开应用,点击卸载应用之后如图3-10的右图所示成功使用隐式Intent成功调用了系统的卸载功能。接下来的步骤和打开应用的功能这里不再上图,开发者可以自己实验。
三、案例总结
1、显示意图打开其他应用必须要知道其他应用的包名和具体类名。
2、隐式意图调用其他应用程序可以不用知道包名,需要设置要做的动作action。

