目录

  • 1 第一周 android简介
    • 1.1 第一课 Android基础入门1
    • 1.2 第二课 Android基础入门2
    • 1.3 第三课 Android UI开发介绍
  • 2 第二周 android布局
    • 2.1 第一课 Android 布局文件介绍1
    • 2.2 第二课 Android 布局文件介绍2
    • 2.3 第三课 Android 布局文件介绍3
  • 3 第三周 Android UI组件开发
    • 3.1 第一课 Button和ImageButton
    • 3.2 第二课 TextView和EditText
    • 3.3 第三课 RadioButton和CheckBox
  • 4 第四周 Android UI组件开发
    • 4.1 第一课 Spinner和ListView
    • 4.2 第二课 应用案例-手机信息页面
    • 4.3 第三课 Android生命周期
  • 5 第五周 Android组件通信
    • 5.1 第一课 Intent的介绍
    • 5.2 第二课 Intent实现各种系统功能
    • 5.3 第三课 应用案例-手机注册页面
  • 6 第六周 数据存储
    • 6.1 第一课 应用案例-新建联系人
    • 6.2 第二课 数据存储-简单文件存储
    • 6.3 第三课 SharedPreferences存储
  • 7 第七周 数据存储
    • 7.1 第一课 xml文件存储
    • 7.2 第二课 应用案例-植物百科
    • 7.3 第三课  ListView 组件高级使用
  • 8 第八周 SQLite数据库
    • 8.1 第一课 应用案例-应用列表
    • 8.2 第二课 使用SQLite数据库存储(创建数据库和表)
    • 8.3 第三课 使用SQLite数据库存储(对表数据操作)
  • 9 第九周 项目实战-商品购物车处理
    • 9.1 第一课 使用SQLite数据库存储(对表数据查询)
    • 9.2 第二课 商品购物车处理(布局)
    • 9.3 第三课 商品购物车处理(数据处理)
  • 10 第十周 内容提供者及广播
    • 10.1 第一课 内容提供者的使用
    • 10.2 第二课 广播概念以及如何使用
    • 10.3 第三课 自定义广播
  • 11 第十一周 广播和服务
    • 11.1 第一课 应用案例-电池电量
    • 11.2 第二课 应用案例-通话记录
    • 11.3 第三课 服务简介
  • 12 第十二周 服务应用
    • 12.1 第一课 应用案例—音乐播放器
    • 12.2 第二课 应用案例—地震监测
    • 12.3 第三课 获得手机SIM卡信息
  • 13 第十三周 网络编程
    • 13.1 第一课 网络编程入门
    • 13.2 第二课 使用HttpClient访问网络
    • 13.3 第三课 webview组件
  • 14 第十四周 网络编程应用案例
    • 14.1 第一课 消息机制简介
    • 14.2 第二课 应用案例-应用升级
    • 14.3 第三课 应用案例-应用升级
第三课 应用案例-手机注册页面

案例  名片注册




一、案例描述

1、考核知识点

01003001Activity的创建

01003002Activity的生命周期

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>  

接下来将TextViewEditText的属性抽取出做单独样式,存放在res/values目录下的styles.xml文件内,TextViewEditText的样式如下所示:

<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逻辑代码

       SecondActivityonCreate()方法中使用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间传递数据

三、案例总结

1Activity必须在清单文件中注册,注册节点为<activity>

2Activity之间的跳转和传输数据使用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 }

2SecondActivity布局

       创建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>

其中ViewEditText的属性抽取出做单独样式,如下所示:

   <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>

3SecondActivity

创建好联系人信息界面后创建一个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.demo1cn.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