Loading

安卓通信复习

题型

选择10道*2分=20分

填空10空*2分=20分

判断10道*2分=20分

简答2道*8分=16分

程序2道*12分=24分(填空)

概念:

  • Android虚拟设备的缩写:AVD
  • Android SDK目前支持的操作系统是:Linux

四大组件:

  • activity:用于表现功能
  • service:主要用于后台运行和跨进程访问
  • broadcast:接收广播
  • contentprovider:多个应用中存取数据

日志工具类Log:

  • 5个级别:(从低到高)

    verbosedebuginfowarnerror

组件:

AlertDialog:新建AlertDialog对象,需要使用内部类Builder的build()方法,不能用new

show()方法:显示AlertDialog

create()方法:创建并显示对话框

//代码范例,帮助理解,别背
/**
 * 提示对话框
 */
public void tipDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setTitle("提示:");
    builder.setMessage("这是一个普通对话框,");
    builder.setIcon(R.mipmap.ic_launcher);
    builder.setCancelable(true);            //点击对话框以外的区域是否让对话框消失
 
    //设置正面按钮
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "你点击了确定", Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    });
    //设置反面按钮
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "你点击了取消", Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    });
    //设置中立按钮
    builder.setNeutralButton("保密", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "你选择了中立", Toast.LENGTH_SHORT).show();
            dialog.dismiss();
        }
    });
 
 
    AlertDialog dialog = builder.create();      //创建AlertDialog对象
    //对话框显示的监听事件
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Log.e(TAG, "对话框显示了");
        }
    });
    //对话框消失的监听事件
    dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            Log.e(TAG, "对话框消失了");
        }
    });
    dialog.show();                              //显示对话框
}

RatingBar:

android:numStars:显示多少个星星,必须为整数
android:rating:默认评分值,必须为浮点数
android:stepSize: 评分每次增加的值,必须为浮点数

MediaPlayer:播放前需要调用prepare()方法完成准备工作

EditText:编辑框的提示信息的属性是android:hint

Toast:可自定时长,单位毫秒,show()显示Toast

文件操作模式:

  • MODE_PRIVATE:写入文件会被覆盖
  • MODE_APPEND:追加

SharedPreferences:

  • SharedPreferences是一种轻量级的数据存储方式,采用键值对的存储方式
  • 只能存储少量数据
  • 存放的数据类型不支持double

内容提供器ContentProvider:

  • 作用是实现数据共享和交换,是Android实现跨程序数据共享的标准方式
  • 内容URI:”content://"。例如:content://com.example.app.provider/table1
  • 可自定义ContentProvider,也可使用系统内置的,比如通讯录
  • 搭配ContentResolver使用,增删查改方法都在ContentResolver对象中

事件模型:

  • 基于监听接口的事件处理,模型有三个对象:事件事件源事件监听器

  • 基于回调机制的事件处理,Android为view提供的5种事件处理的回调方法:

    onKeyDown()键盘按下事件
    onKeyUp()键盘抬起事件
    onTouchEvent()触摸事件
    onTrackBallEvent()轨迹球事件
    onFocusChanged()焦点改变事件

解析XML方式:

  • DOM解析
  • SAX解析
  • Pull解析

通信:

  • HandlerrunOnUiThread方法、AsyncTask等:实现不同线程间通信的机制
  • Intent文件共享ContentProviderSocket等:实现不同进程间通信的机制
  • 在Activity中,Main线程消息队列中的消息在5秒内没有得到响应,就有可能弹出ANR对话框。
  • 在BroadcastReceiver中,onReceive()方法执行时间超过10秒 ,就有可能弹出ANR对话框

广播broadcast:

  • 分类:有序广播和无序广播

  • 注册方式:静态注册(AndroidManifest.xml中注册)和动态注册(代码注册)

  • sendOrderBroadcast用来向系统广播有序事件,sendBroadcast用来向系统广播无序事件

  • 使用abortBroadcast方法可以中断有序广播的传递,无序广播无法中断

  • 注册方式的区别:

    ​ 第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于像开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。

    ​ 第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露

通知notification:

  • 需要NotificationManager来管理 Notification

    (NotificationManager)getSystem(NOTIFICATION_SERVICE)

  • 使用NotificationManager的notify方法显示notification消息,或者使用后台服务中的startForeground()方法

  • 自定义震动:

    • 方法:setVibrate()

    • 权限:android.permission.VIBRATE

  • 自定义灯光:

    • 方法:setLight()
  • 自定义声音:

    • 方法:setSound()
  • 默认震动、灯光、声音:setDefault()

  • 优先级:

    通知的优先级可通过setPriority()方法设置,括号中传递参数为int类型的优先级常量,例如setPriority(NotificationCompat.PRIORITY_MAX)将该通知的优先级设置为PRIORITY_MAX,但要注意选择合适的优先级常量,提高用户体验

    优先级常量有:
    PRIORITY_DEFAULT

    PRIORITY_HIGH

    PRIORITY_LOW

    PRIORITY_MAX

    PRIORITY_MIN

服务Service:

  • 生命周期

    • Service 有两种不同的启动模式 ,不同的启动模式对应不同生命周期.

    • (重点)Service启动模式主要分两种: 1. 启动模式 2. 绑定模式

    • 启动模式:StartService

      通过StartService()方法启动服务,先后调用生命周期方法onCtreat()和onstartcommand(),前者在创建服务时,只调用一次,后者可调用多次,当调用stopself()stopService()方法时,会调用生命周期方法onDestroy()销毁服务

    • 绑定模式:bindService

      通过bindService()方法启动服务,先后调用生命周期方法onCtreat()和onbind(),前者在创建服务时,只调用一次,后者用于将服务和组件绑定,当调用stopself()unbindService()方法时,会先后调用生命周期方法onUnbind()解除绑定和onDestroy()销毁服务

  • 重点intentServiceservice

    • Service

      Service 是长期运行在后台的应用程序组件。

      Service 不是一个单独的进程,它和应用程序在同一个进程中,Service 也不是一个线程,它和线程没有任何关系,所以它不能直接处理耗时操作。如果直接把耗时操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗时操作就必须开启一个单独的线程来处理

    • IntentService

      IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求

服务Service课堂代码非常重要!

编程题应该是bindService

  • MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
🔥      this.<Button>findViewById(R.id.button12).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button12:
                //测试Service
                intent=new Intent(this, LifeServiceActivity.class);
🔥              startActivity(intent);
                break;
            default:
        }
    }
}
  • LifeServiceActivity
public class LifeServiceActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "LifeServiceActivity";
🔥  private ServiceConnection connection;
🔥  private ServiceLife mService;
    Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_service);

        findViewById(R.id.button8).setOnClickListener(this);//绑定
        findViewById(R.id.button10).setOnClickListener(this);//解绑
        findViewById(R.id.button11).setOnClickListener(this);//获取服务数据

🔥      intent=new Intent(LifeServiceActivity.this,ServiceLife.class);

🔥       connection=new ServiceConnection() {
            /**
             * 系统会调用该方法以传递服务的OnBind()方法返回的IBinder
             * @param componentName
             * @param iBinder  OnBind()方法返回的IBinder
             */
            @Override
🔥          public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                Log.d(TAG, "onServiceConnected: 绑定成功");
                ServiceLife.MyBinder mbinder= (ServiceLife.MyBinder) iBinder;
🔥              mService=mbinder.getService();
            }

            //系统与服务连接意外中断时调用,注意,客户端接触绑定,并不会调用该方法
            @Override
🔥          public void onServiceDisconnected(ComponentName componentName) {
🔥              mService=null;
                Log.d(TAG, "onServiceDisconnected: 即使解绑,也不会调用该方法,除非是系统意外中断");
            }
        };

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button8:
                //绑定服务
                Log.d(TAG, "启动服务bindService");
🔥              bindService(intent,connection, Service.BIND_AUTO_CREATE);
                break;
            case R.id.button10:
                //解除绑定
                Log.d(TAG, "停止服务unbindService");
 🔥             if (mService!=null){
                    mService=null;
 🔥                 unbindService(connection);
                }
                break;
            case R.id.button11:
                //获取服务数据
                if (mService!=null){
🔥                  Log.d(TAG, "从服务中获取数据"+mService.getCount());
                }else {
                    Log.d(TAG, "还未绑定服务,故无法获取服务数据");
                }
                break;
            default:
        }
    }
}
  • ServiceLife
/**
 * 生命周期:服务与活动通信
 */
public class ServiceLife extends Service {

    private static final String TAG = "ServiceLife";
    private int count;
    private boolean quit;
🔥  private MyBinder binder=new MyBinder();

🔥  class MyBinder extends Binder{

        //通过connection可获取到Binder对象,再调用该方法即可获取到Service对象,即可实现调用该服务下的其他公共方法
        ServiceLife getService(){
            Log.d(TAG, "getService: 获取到了service对象");
🔥          return  ServiceLife.this;
        }
    }


    //将IBinder传给onServiceConnected方法
    @Nullable
    @Override
🔥  public IBinder onBind(Intent intent) {
        return binder;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: 被创建了");
🔥      new Thread(new Runnable() {
            @Override
            public void run() {
                while (!quit){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count++;
                }
            }
        }).start();
    }

    public int getCount(){
        return count;
    }

    @Override
🔥  public void onDestroy() {
        Log.d(TAG, "onDestroy: 被销毁了");
        this.quit=true;
🔥      super.onDestroy();
    }

    @Override
🔥   public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind: 被解绑了");
🔥      return super.onUnbind(intent);
    }
}

客观题会考之前的内容

Android:在移动设备上,指操作系统,Android大致可分为四层架构:Linux内核层、系统运行库层、应用框架层和应用层
	
	Android四大组件:活动、服务、广播接收器和内容提供器
	
	Android日志工具Log:
		Log.v( ) 打印最为琐碎、意义最小的日志消息,最低级别verbose
		Log.d( ) 打印调式信息,对程序调试和问题应该有帮助,级别debug
		Log.i( )  打印重要数据,是你非常想看到的、可以帮助你分析用户行为的数据,级别info
		Log.w( ) 打印警告信息,告知程序的潜在风险,建议修复,级别warn
		Log.e( ) 打印错误信息,告知程序出现严重问题,必须尽快修复,最高级别,级别error
		
	Android资源文件:
	res/layout/    存放布局文件
	res/values/    存放字符串、样式、颜色等文件
	res/mipmap/    存放图标
	res/drawable/  存放图片
	.......
	R.java   自动尝试,自动同步更新
	
	UI:
		Android当中基本所有的UI控件都是由View或者其子类实现的。
		比如EditView,该控件中的属性inputType规定了输入的类型,常用的取值有textPassword、number、text、textEmailAddress等
		
	
	布局管理:
		常用布局:线性布局、相对布局、表格布局、帧布局
		熟悉各个布局的定义
	
	activity
		activity的生命周期:
			onCreat():表示创建,活动第一次被创建的时候调用,主要在该方法中完成活动的初始化操作,此时活动还不可见。在activity创建过程中,只执行一次。
			onStar():表示启动,此时活动可见,但不在前台,不可交互。可执行多次。
			onResume():表示继续、重新开始,activity可见且在前台,在活动准备好和用户进行交互时调用。此时activity进入运行状态。
			onPause():表示暂停,当activity被其他activity覆盖其上或锁屏时被调用,activity可见,且还存在与内存中。常在该方法中释放一些消耗CPU的资源,以及保存一些关键数据。不能执行太过耗时的操作。进入暂停状态
			onStop():表示停止,activity不可见,且还存于内存中。当activity转到新的activity界面或按Home键回到主屏,自身退居后台时,系统会调用onpause方法,再调用onstop方法,进入停止状态
			onDestroy():表示销毁。activity被销毁,不可见,可在此方法中进行资源释放和回收工作。退出当前activity,即结束当前activity时,onPause→onStop→onDestroy
			onRestar():表示重新开始,在活动由停止状态变成运行状态之前调用,activity被重新启动
		activity向下一个页面传递参数:
			通过intent的putExtra()方法实现
		返回数据给上一个activity:
			启动一个新的activity,并且获取这个activity的返回值用startActivityForResult()方法启动,并通过setResult()方法返回。
	Intent 
	显示Intent
	隐式intent
		属性Action常用的取值:
			-----activity:
			ACTION_CALL 启动一个电话
			ACTION_EDIT 显示用户编辑的数据
			ACTION_MAIN 作为task中第一个activity启动
			ACTION_SYNC 同步手机与数据服务器上的数据
			------broadcast receiver
			ACTION_BATTERY_LOW:电池电量过低警告。
			ACTION_SCREEN_ON:屏幕变亮警告。
			CONNECTIVITY_CHANGE:网络连接改变警告。
			ACTION_HEADSET_PLUG:拔插耳机警告。 
	广播:
		分类:标准广播、有序广播
		注册方式:动态注册、静态注册
		注册方式的区别:
			第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于像开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
			第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄露

	文件存储数据:
		文件存储的路径:/data/data/<package name>/files/<文件名>
		写数据:public FileOutputStream openFileOutput(String name, int mode)
		读数据:public FileInputStream openFileInput(String name)
			name:文件名
			mode:文件操作模式,常用MODE_PRIVATE(默认):覆盖;
									MODE_APPEND:追加
	SharedPreferences存储:
		文件存储的路径:/data/data/<package name>/shared_prefs/<文件名>
		以键值对的形式存储
		获取SharedPreferences对象:public SharedPreferences getSharedPreferences(String name, int mode)
		SharedPreferences.Editor的putXXX方法存入文件
		SharedPreferences.Editor的apply或commit方法提交文件
	LitePal框架-数据库存储:
		是一款开源的Android数据库框架
		存储路径:/data/data/<package name>/databases/<文件名>
		实体类(模型类)必须继承DataSupport才能进行CRUD操作
	
	运行时权限:
		普通权限:应用在安装时,默认自动授权
		危险权限:在使用应用时,需要用到该部分的功能时才授权,拒绝仍可使用权限外的功能
				  共9组24个危险权限
	内容提供器:
		是Android实现跨程序共享数据的标准模式
		内容URI:
			content://com.example.app.provider/table1
				表示调用方期望访问的是com.example.app这个应用的table1表中的数据。
			content://com.example.app.provider/table1/1
				表示调用方期望访问的是com.example.app这个应用的table1表中的id为1的数据
			content://com.example.app.provider/*
				表示一个能匹配任意表的内容URI
				
			content://com.example.app.provider/table1/#
				表示一个能匹配table1表中任意一行数据的内容URI
posted @ 2021-07-01 14:08  Songcubi  阅读(181)  评论(0)    收藏  举报