Android开发基础

Android应用程序的构成

目录结构

Android应用程序主要由三部分组成:应用程序描述文件.xml,各种资源文件,应用程序源代码.java。

  1. src——存放Android应用程序中的所有Java源码

  2. AndroidManifest.xml

    • 项目的系统控制文件,每个Android项目必须有这个文件,位于项目根目录下。

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.chapter322_progressbar">     声明应用程序的包名
      
          <application
              android:allowBackup="true"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:roundIcon="@mipmap/ic_launcher_round"
              android:supportsRtl="true"
              android:theme="@style/AppTheme">
              <activity android:name=".MainActivity" android:label="@string/app_name">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
      
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
          </application>
      
      </manifest>
      

      在这里插入图片描述

      在这里插入图片描述
      在这里插入图片描述

      在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  3. res——存放资源文件

    • drawable目录:存放一些图片资源

    • layout目录:存放应用程序的布局文件;文件类型为xml,用xml元素来设定屏幕布局;每个xml文件都包含整个或部分屏幕的视图资源。

      <?xml version="1.0" encoding="utf-8"?>
      <androidx.constraintlayout.widget.ConstraintLayout    设置布局样式
                                                         			
          xmlns:android="http://schemas.android.com/apk/res/android"  xml命名空间声明,每一个android布局文件的最外层标签必须由这个属性
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          tools:context=".MainActivity">  
      
          <TextView
              android:id="@+id/textView"             设置控件id并添加到R.java文件中
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginTop="32dp"
              android:padding="16dp"
              android:text="@string/hello"    设置控件文本位strings.xml中的常量hello
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintHorizontal_bias="0.5"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent" />
      
          <ProgressBar
              android:id="@+id/progressBar"
              style="?android:attr/progressBarStyleHorizontal"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_marginTop="16dp"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintHorizontal_bias="0.5"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/textView" />
         
          <Button
              android:id="@+id/button_hand"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginTop="8dp"
              android:text="手动增加进度"
              app:layout_constraintEnd_toStartOf="@+id/progressBar2"
              app:layout_constraintHorizontal_bias="0.5"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toBottomOf="@+id/progressBar" />
      
      </androidx.constraintlayout.widget.ConstraintLayout>
      

    在这里插入图片描述

    • values目录:存放所有xml格式的资源描述文件,例如string.xml, colors.xml, styles.xml, demens.xml(尺寸)和arrys.xml(数组)等描述文件

      strings.xml:

      <resources> 定义资源的标签
          <string name="app_name">chapter322-progressbar</string>  定义字符串常量
      </resources>
      

      colors.xml:

      <?xml version="1.0" encoding="utf-8"?>     声明xml的版本以及编码方式
      <resources>
          <color name="colorPrimary">#6200EE</color>    定义颜色资源,颜色值由RGB(三位十六进制数)
          <color name="colorPrimaryDark">#3700B3</color>     或RRGGBB(6位十六进制数)表示,以"#"开头
          <color name="colorAccent">#03DAC5</color>
      </resources>
      
      

      dimens.xml:

      通常用于创建布局常量,在样式和布局资源中定义边界、高度、尺寸、大小等
      使用<demen></demen>指定一个维度资源
      常用维度定义单位如下:px(像素)、in(英寸)、mm(毫米)、pt(磅):1.72英寸、dip、sp
      

      styles.xml:

      <resources>
      
          <!-- Base application theme. -->
          <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 定义名称位AppTheme的样式
              <!-- Customize your theme here. -->
              <item name="colorPrimary">@color/colorPrimary</item>
              <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
              <item name="colorAccent">@color/colorAccent</item>
          </style>
          <style name="BaseText">
              <item name="android:textSize">14sp</item>  定义字体大小
              <item name="android:textColor">#111</item>  定义字体颜色
          </style>
      </resources>
      
      
    • 注意:

      res目录文件中的所有文件名只能是“a"“z”,"0"“9”,"_"字符命名,不能包含大写字符,否则会导致错误。

视图——Activity

  1. 什么是Activity?

    • Activity是一个可以与用户交互的组件,每个视图通过继承系统AppCompatActivity类的子类来实现;
    • 从功能上来说,它作为应用程序的界面框架,负责动态加载各种用户界面视图,实现底层的消息传递等,不能简单地把Activity简单视为一个屏幕,而应把它看作一个功能强大的界面管理者,它负责调度各种界面视图,帮助开发人员完成Android应用与用户之间的UI交互。
    • 从逻辑上来说,Activity是Android应用的组成部分,一个Android应用可以包含多个Activity(当然还包含其他类型的组件如Service、Content Provider等)
  2. AppCompatActivity类

    在这里插入图片描述

    • onCreate:视图第一次启动时调用,完成活动初始化工作
    • onStart:触发此方法将活动展现给用户
    • onResume:当一个活动失去焦点时,触发该方法
    • onPause:当活动转入后台运行时触发该方法,需要将活动的状态持久化
    • onStop:当一个活动不再需要展示触发该方法。内存紧张,系统会直接结束活动
    • onDestroy:当活动销毁的时候,触发该方法
    • onRestart:重新启动Activity时被调用,该方法总是再onStart方法后执行
  3. Android生命周期流程图和状态图

    • Running(运行):在屏幕前台(位于当前任务堆栈的顶部)
    • Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity是透明或未完全遮挡)
    • Stopped(停止):完全被另一个视图覆盖
    • Destroyed(销毁):Activity完全被销毁
  4. 其他:

    • 如果一个程序有多个Activity,则需要再AndroidManifest.xml配置文件中将其中一个Activity标记为启动Activity,以启动程序。
  5. 第一个Activity程序(运行结果参照Android应用程序开发教程Android Studio版——100页)

    • MainActivity.java
    public class MainActivity extends AppCompatActivity {
        String msg = "Android:";
    
        /** Called when the Activity is firest created. */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            /**
             * Activity(活动)通过setContentView方法加载工程res/layout目录下的xml文件,从而调用UI组件。
             */
            setContentView(R.layout.activity_main);
            Log.d(msg, "The onCreat() event.");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(msg, "The onStart() event.");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(msg, "The onResume() event.");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(msg, "The onPause() event.");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(msg, "The onStop() event.");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(msg, "The onDestroy() event.");
        }
    }
    
    • AcdroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.app02">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <!--
    			一个应用程序可以包含多个Activity(活动),但是每个Activity必须在AndroidManifest.xml配置文件中进行声明。
    			同时,主Activity还需要用<intent-filter>标签标明为MAIN动作和LAUNCHER类,否则用户无法在手机屏幕上看见应用程序的APP图标。
    		-->
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

Android UI 设计

UI 布局

布局方式是指一组View元素如何布局,准确地说就是一个ViewGroup中的View如何布局。

Android UI布局一般使用布局管理器、ListView(列表视图)、GridView(网格视图)三种。

用户界面通过View和ViewGroup对象构建;Android中有很多种View和ViewGroup,她们都继承自View类;View对象是Android平台上表示用户界面的基本单元;

布局管理器

  • 在这里插入图片描述

  • FrameLayout

    在这里插入图片描述

         <?xml version="1.0" encoding="utf-8"?>
         <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context=".MainActivity">
         <!--    添加剧中显示的安卓图标图片ImageView,将显示在最下层-->
             <ImageView
                 android:src="@drawable/ic_launcher"
                 android:layout_width="match_parent"
                 android:layout_height="392dp"
                 android:scaleType="fitCenter"
                 android:layout_gravity="center_vertical"
                 />
         <!--    添加居中显示的Frame Demo文字TextView,将显示在最少上层-->
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="Frame Demo"
                 android:textSize="30px"
                 android:textStyle="bold"
                 android:layout_gravity="left|bottom"
                 android:gravity="center"
                 />
         
         </FrameLayout>
    
  • LinearLayout

    以单一方向对其中的View对象进行排列显示,垂直排列时屏幕中将只有一列,水平排列时屏幕中将只有一行。

    对于多个显示对象,线性布局保持他们之间的间隔以及互相对齐。

    在这里插入图片描述

  • TableLayout

    1. 每个单元格内只显示一个View对象。
    2. 表格布局类每一行为一个TableRow对象,TableRow中可以添加显示对象,每添加一个显示对象为一列。
    3. 一个列的宽度由该列中最宽的那个单元确定;表格宽度由父容器决定。
    4. 布局中的空单元格可以向HTML那样跨越多个列。
    5. 在这里插入图片描述
  • RelativeLayout

    1. 通过指定View对象相对与其他显示对象或父级对象的相对位置来布局。

    2. 在这里插入图片描述

      在这里插入图片描述

    3. 进行相对布局时要避免循环依赖。

  • AbsoluteLayout

    1. 允许以坐标方式指定View对象的具体位置,左上角的坐标为(0,0)。
    2. 每个对象都要通过计算其坐标的方式来定位和布局,较为麻烦耗时。

ListView(列表视图)

基础知识

ListView以垂直列表形式列出要显示的列表项目。

一般来说,ListView都是和Adapter(适配器)一起使用,数组数据或数据库数据都是通过Adapter把值传递给ListView组件。

实际上,Adapter将数据源中得到的数据传递给AdapterView(适配器视图),AdapterView将数据呈现在Spinner(列表选择框)、ListView(列表视图)、GrideView(网格视图)等UI组件中。

ListView和GrideView是AdapterView的子类。

Adapter的子类:ArraryAdapter(数组适配器)、BaseAdapter(基本适配器)、Cursor Adapter(游标适配器)、SimpleCursorAdapter(简单游标适配器)、SpinnerAdapter(列表适配器)和WrapperListAdapter(封装列表适配器)。

ListView常用属性

在这里插入图片描述

数组适配器
  • 使用方法

    1. 在这里插入图片描述
    2. 在这里插入图片描述
  • 示例:

    /**
     * MainActivity.java
     */
    public class MainActivity extends AppCompatActivity {
        //Array of Strings ...
        String[] mobileArray = {"Android", "IPhone", "oppo", "vivo", "huawei", "xlinx", "fpga"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //装配数据,ArrayAdapter<>(this,布局文件:描述的时列表的每一行的布局,数据)
            ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, mobileArray);
            //通过Id找到ListView列表
            ListView listView = (ListView) findViewById(R.id.mobile_list);
            //将listview和adapter进行绑定
            listView.setAdapter(adapter);
      }
    }
    
    <!-- activity_main.xml -->
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
        
        <ListView
            android:id="@+id/mobile_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
      
    </LinearLayout>
    

    布局文件:列表中每行的布局

    <!-- activity_listView.xml -->
    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/label"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dip"
        android:textSize="16dip"
      android:textStyle="bold"
        >
    
    </TextView>
    

    结果:

    在这里插入图片描述

GridView(网格视图)

  • 常用属性

    在这里插入图片描述

  • 通常使用ImageAdapter(图片适配器)为组件提供数据

  • 示例:

    1. 显示图片

      ImageAdapter.java

      public class ImageAdapter extends BaseAdapter {
          private Context mContext;
      
          //Constructor
          public ImageAdapter(Context mContext) {
              this.mContext = mContext;
          }
      
          @Override
          public int getCount() {
              return mThumbIds.length;
          }
      
          @Override
          public Object getItem(int position) {
              return null;
          }
      
          @Override
          public long getItemId(int position) {
              return 0;
          }
      
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              ImageView imageView;
      
              if (convertView == null) {
                  imageView = new ImageView(mContext);
                  imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
                  imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                  imageView.setPadding(8, 8, 8, 8);
              } else {
                  imageView = (ImageView) convertView;
              }
              imageView.setImageResource(mThumbIds[position]);
              return imageView;
          }
      
          //keep all Image in array
          public Integer[] mThumbIds = {
              R.drawable.sample1,R.drawable.sample2,R.drawable.sample3,
                  R.drawable.sample1,R.drawable.sample2,R.drawable.sample3,
                  R.drawable.sample1,R.drawable.sample2,R.drawable.sample3
          };
      }
      

      MainActivity.java

      public class MainActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              GridView gridView = (GridView) findViewById(R.id.gridview);
              gridView.setAdapter(new ImageAdapter(this));
          }
      }
      

      activity_main.xml

      <?xml version="1.0" encoding="utf-8"?>
      <GridView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/gridview"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:columnWidth="90dp"
          android:numColumns="auto_fit"
          android:verticalSpacing="10dp"
          android:stretchMode="columnWidth"
          android:gravity="center"    
          />
      
    2. 点击图片全屏显示

Android UI 控件

  • TextView(文本框)

    1. 包名:android.widget.TextView
    2. 向用户显示文本内容。
    3. 在这里插入图片描述
    4. TextView的背景色可以使用android:background属性设置;颜色常量使用“#RRGGBB”6位16进制数表示。
    5. 在这里插入图片描述
  • EditText(编辑框)

    1. 包名:android.widget.EditText;继承自TextView
    2. 向用户显示文本内容,并允许用户对文本进行编辑的控件。
    3. 在这里插入图片描述
  • AutoCompleteTextView(自动填充文本)

  • Button(普通按钮)

    1. 包名:android.widget.Button;继承自TextView
    2. Button的背景可以是背景颜色,也可以是背景图片。
    3. 当用户对按钮按下或单击之后,按钮控件就会触发onClick事件,所以需要对按钮设置setOnClickListener事件监听。
  • ImageButton(图片按钮)

    1. 继承自ImageView

    2. 功能与Button控件一致。主要区别在于ImageButton中没有text属性,即按钮只显示图片不显示文本。

    3. 控件中设置按钮显示图片时可通过android:src属性,代码中动态设置图片使用setImageResource(int)方法来实现。

    4. ImageButton与Button一样都具有背景颜色,为了不影响图片显示,一般设置背景色为透明或者其他图片。

    5. 案例设计(用于描述按钮被按下和未按下的两种状态显示的不同的照片)

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

  • CheckBox(复选框)

    1. 在这里插入图片描述
  • ToggleButton(开关按钮)

  • RadioButton(单选按钮)与RadioGroup(按钮组)

    1. 在这里插入图片描述
  • ImageView(图片)

    1. 负责显示图片,还可以执行一些其他操作:设置alpha值、调整图片尺寸等。
    2. 图片来源:资源文件ID、drawable目录中的图片对象、Content Provider中的URI等。
    3. 在这里插入图片描述
    4. 在这里插入图片描述
  • AnalogClock和DigitalClock

    1. 都位于android.widget包下
    2. AnalogClock以模拟时钟指针形式显示时间。
    3. DigitalClock以数字形式显示时间。
  • 使用进度对话框ProgressDialog类创建ProgressBar(进度条)

    1. 在这里插入图片描述
    2. 在这里插入图片描述
  • Spinner(列表选择框)

  • TimePicker(时间拾取器)和DatePicker(日期拾取器)

Android应用核心Intent和Filters

  • Intent(意图)是一个将要执行操作的抽象描述。

  • Android的3个核心组件Activity(活动)、Service(服务)和BroadcastReceiver(广播接收器)都需要使用Intent通信。

  • Intent用于相同或者不同应用程序组件间的后期运行时绑定。

  • 在这里插入图片描述

Intent的各属性

  1. Component(组件)

    • 组件名称是要处理这个Intent的组件的名称。
    • 组件名是可选的,如果设置了,这个Intent对象会被传递到指定的类,如果没有设置,则在AndroidManifest.xml中,通过使用IntentFilter来找与该Intent最合适的组件。
    • 组件名字通过setComponent(), setClass(), 或者setClassName()来设置,通过方法getComponent()来读取。
  2. Action(动作)

    • 一个将被执行的动作的字符串命名,或者对广播意图而言,是发生并报告的动作。这个Intent类定义了一些动作常量,用大写英文单词和下划线组成。

    • 在这里插入图片描述

      在这里插入图片描述

  3. Category(类别)

    • 类别是关于Intent中action要执行的动作的附加描述,他是一个字符串。可以把任意数目的类别描述放到一个Intent对象中。
    • 在这里插入图片描述
    • 通过addCategory()方法在一个Intent对象中添加一个类别,通过removeCategory()方法删除之前添加的类别,通过getCategories()方法可以获得当前对象的所有类型。
  4. Data(数据)和Type(类型)

    • 数据(Data)为动作提供要操作的信息,用指向数据的一个资源标识符(URI)表示。
    • 不同动作伴随着不同的数据规格(Type)。
    • 在这里插入图片描述
  5. 附加信息(Extra)

    • 附加信息就是要递交给Intent处理组件的附加信息键-值对。
    • 例如:HEADSET_PLUG_ACTION有一个状态附加字段表明耳机有没有插着。
    • Intent对象中有一系列的put…()方法来插入各种不同附加数据,一系列get…()方法来读取数据。这些方法与Bundle对象的方法相似。
    • 事实上,附加信息就是可以当作一个Bundle对象,通过使用putExtras()和getExtras()方法类插入和读取。
  6. 标志

    • 表示(flag)是各种类型的标志。
    • 许多标志用来指示Android系统该如何去加载一个Activity和启动后如何对待他。
    • 在这里插入图片描述

Intent过滤器

  • 意图过滤器只对隐式意图起作用。
  • 可以用Java代码来设置IntentFilter类的一个实例,但更多的是使用应用程序清单AndroidManifest.xml中设置标签,在其中设置需要过滤的内容。

Intent解析

通过比较Intent对象内容和意图过滤器,找到相匹配的目标组件。

如果一个组件没有任何意图过滤器,那么它只能就收显式意图;一个带过滤器的组件可同时接收显式意图和隐式意图。

  1. 检查Action
    • 一个Intent只能设置一种Action,但是一个IntentFilter可以设置多个Action过滤。
    • 当设置了很多Action过滤时,只要满足一个即可完成Action验证。
    • IntentFilter没有声明任何Action,那么任何一个Action都不能与之匹配;一个Intent中没有任何Action,则可以与任何含有Action的IntentFilter匹配成功。
  2. 检查Data
    • 对URI进行监测、对数据类型进行监测
    • 数据URI又被分为三部分:scheme, authority, path,只有这三种信息完全匹配时,Data才验证成功。
  3. 检查Category
    • 在IntentFilter中同样可以设置多个Category。
    • 当Intent中的Category与IntentFilter中的一个Category完全匹配时,此Category便会通过,而其他Category并不会受影响。

通信示例:

点击按钮跳转到第二个Acitvity,并传递相应信息

    private void intentToSecond() {
        Intent intent1 = new Intent(MainActivity.this, SecondActivity.class);
        intent1.putExtra("activitymain", "从AcitvityMain传入");
        startActivityForResult(intent1,REQUEST_CODE);
    }

第二个Activity中,读取并显示

private void initView() {
        String data = null;
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            data = extras.getString("activitymain");
        }
        setTitle("现在时在SecondActivity里:"+data);
    }

第二个Acitvity中点击按钮,返回第一个Acitvity并传值

 private void clickButton() {
        Bundle bundle = new Bundle();
        bundle.putString("store","来自SecondActivity返回");
        Intent intent2 = new Intent();
        intent2.putExtras(bundle);
        setResult(RESULT_OK, intent2);
        finish();
    }

从第二个Activity返回到第一个Activity,并显示信息

 //在第一个Activity中通过重写onActivityResult()实现
 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE) {
            if (resultCode == RESULT_CANCELED) {
                setTitle("取消");
            } else if (resultCode == RESULT_OK) {
                String temp = null;
                Bundle extras = data.getExtras();
                if (extras != null) {
                    temp = extras.getString("store");
                }
                setTitle("现在是在ActivityMain里:" + temp);
            }
        }
    }

用户界面状态保存

当Activity实例与用户交互时,会产生一些状态信息:用户选取的值、光标的位置等;

如果此时该Activity进入“暂停”或“停止”状态时,需要保存这些临时状态信息。

  1. 使用SharePreferences对象
    • SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些Activity的状态信息:字体、颜色、位置等
    • 在Activity中重载窗口状态的参数SaveInstanceState一般使用SharedPreferences完成保存。
    • 顾名思义,SharedPreferences是在同一个Package中进行共享的Preferences。SharedPreferences对象的访问权限是私有的。
    • SharedPreferences处理的是键-值对二元组,支持常见的String、Long、Float、Interger、Boolean等数据类型。
    • 在这里插入图片描述
  2. 使用Bundle对象
    • 在Activity生命周期中的多个方法中,都使用Bundle对象来保存Activity相关的状态信息。如方法onCreate(), onSaveInstanceState(), onRestoreInstanceState()。
    • Bundle对象封装数据也是键值对二元组,用Bundle绑定数据便于处理。所以利用他的数据封装能力,将要传递的数据或参数通过Intent对象来传递到不同的Activity之间,也是比较简单的方法。
    • Bundle对象中的数据是保存在应用程序的上下文中的,如果应用程序推出,相应的上下文也就销毁了,Bundle对象也就不存在了。
    • 在这里插入图片描述
  3. SharedPreferences和Bundle的区别
    • SharePreferences是简单的存储持久化设置,将数据保存在一个xml文件中,常用于保存应用程序结束前的一些界面状态信息。
    • Bundle是将数据传递到另一个上下文中或保存,或回复自己的状态的数据存储方式,常用于应用程序运行时。

Androd事件处理

响应用户动作的机制就是事件处理

## 基于回调机制的事件处理

  1. 概述:

    回调机制实质是将事件的处理绑定在控件上,由图形用户界面控件自己处理事件。

    回调不是由该方法的实现方直接调用,而是在特定事件或条件发生时,由另外一方通过一个接口来调用,用于对该事件或条件进行响应。

    在Android平台中,每个View都有自己的处理事件的回调方法;当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法。

  2. onKeyDoown()

    • 几乎所有View

    • 捕获手机键盘被按下的事件

    • 该方法的接口是KeyEvent.Callback中的抽象方法

    • public bolean onKeyDown(int keyCode, KeyEvent event)

    • 参数:

      keyCode:被按下的键值

      event:按键事件的对象,包含事件的详细信息

      返回值为true表示已经完整地处理了这个事件,并不希望其他回调方法再一次处理;false表示未完全处理,需要其他回调方法进一步处理,例如Activity中的回调方法。

  3. onKeyUp()

    • 捕获手机键盘抬起的事件
    • 其他属性与onKeyDown()类似
  4. onTouchEvent()

    • 几乎所有View

    • 捕获手机屏幕的触摸的事件

    • public boolean onTouchEvent(MotionEvet event)

    • 该方法一般情况下会处理三种事件:

      屏幕被按下:此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN

      屏幕被抬起:此时MotionEvent.getAction()的值为MotionEvent.ACTION_UP

      屏幕被拖动:此时MotionEvent.getAction()的值为MotionEvent.ACTION_MOVE

  5. onTrackballEvent()

    • 轨迹球事件
  6. onFocusChanged()

    • 捕获焦点改变事件

    • 只能再View中重写

    • protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)

    • 参数:

      ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false

      direction:表示焦点移动方向,用数值表示

      previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。

    • 在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。

    在这里插入图片描述

基于监听接口的事件处理

  1. 概述:引用Java中的事件监听处理机制,包括事件、事件源和事件监听器。
  2. 监听事件处理模型
    • 事件源与事件:各个控件在不同触发情况下,产生的事件也不同
    • 事件监听器:用来处理事件对象,实现特定的接口,根据事件的不同重写不同的事件处理方法来处理事件。
    • 事件源与事件监听器:

otionEvent.getAction()的值为MotionEvent.ACTION_DOWN`

 **屏幕被抬起**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_UP`

 **屏幕被拖动**:此时`MotionEvent.getAction()`的值为`MotionEvent.ACTION_MOVE`
  1. onTrackballEvent()

    • 轨迹球事件
  2. onFocusChanged()

    • 捕获焦点改变事件

    • 只能再View中重写

    • protected void onFocusChanged(boolean gainFocus, int direction, Rect PreviouslyFocuseRect)

    • 参数:

      ginFocus:表示触发该事件的View是否获得了焦点,获得焦点为true,否则为false

      direction:表示焦点移动方向,用数值表示

      previouslyFocusedRect:表示触发事件的View的坐标系中,前一个获得焦点的矩形区域。如果不可用则为null。

    • 在图形界面中,焦点描述了按键事件的承受者,每次按键事件都发生在拥有焦点的View上。

    [外链图片转存中…(img-ufIkQwsc-1585896969004)]

基于监听接口的事件处理

  1. 概述:引用Java中的事件监听处理机制,包括事件、事件源和事件监听器。
  2. 监听事件处理模型
    • 事件源与事件:各个控件在不同触发情况下,产生的事件也不同
    • 事件监听器:用来处理事件对象,实现特定的接口,根据事件的不同重写不同的事件处理方法来处理事件。
    • 事件源与事件监听器:
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值