android

作者: 鸡龙 | 来源:发表于2020-08-27 22:54 被阅读0次

四大组件:Activity、Service、ContentProvider、BroadcastReceiver

常用权限:

<uses-permission android:name="android.permission.INTERNET" /> 允许网络访问
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />允许读写SD卡
<uses-permission android:name="android.permission.SEND_SMS"/>发送短信
<uses-permission android:name="android.permission.READ_SMS"/>读取短信
<uses-permission android:name="android.permission.RECEIVE_SMS"/>监控短信接收
<uses-permission android:name="android.permission.CALL_PHONE"/>拨打电话
    <uses-permission android:name="android.permission.READ_CONTACTS"/>读取联系人

五、数据存储

  1. 文件存储
  2. SharedPreferences:XML文件存储
  3. SQLite数据库
  4. ContentProvider:内容提供者
  5. 网络存储

七、内容提供者

  1. ContentProvider:内容提供者

    • 继承ContentProvider

    • AndroidManifest注册提供者

      <provider android:name=".PersonProvider"
                android:authorities="cn.itcast.contentobserverdb"
                android:enabled="true"
                android:exported="true">
      </provider>
      

      与authorities中符合即可进行该提供者中获取数据

      进入提供者后还需要使用UriMatcher判断路径

  2. ContentResolver:访问其他程序数据

    ContentResolver resolver = getContentResolver();
    uri = Uri.parse("content://cn.itcast.contentobserverdb/info");
    resolver.insert(uri, values);
    resolver.delete(uri, "name=?",new String[]{"itcast0"});
    Cursor cursor = resolver.query(uri, new String[]{"_id", "name"}, null, null, null);
    resolver.update(uri, values, "name=?",new String[]{"itcast1"});
    
  3. contentObserver:内容观察者

    • 继承ContentObserver

    • 注册观察者getContentResolver().registerContentObserver()

      Uri uri = Uri.parse("content://cn.itcast.contentobserverdb/info");
      //注册内容观察者,参数uri指向要监测的数据库info表,
      //参数true定义了监测的范围,最后一个参数是一个内容观察者对象
      ContentObserver obs = new MyObserver(new Handler());
      getContentResolver().registerContentObserver(uri, true,obs);
      
      //取消注册内容观察者
      getContentResolver().unregisterContentObserver(obs);
      

八、广播接收者

1、广播接收者是通过Binder机制在AMS(Activity Manager Service)中进行注册的

2、广播发送者是通过Binder机制向AMS发送广播。

3、AMS查找符合相应条件(IntentFilter/Permission)的广播接收者(BroadcastReceiver),将广播发送到相应的消息循环队列中

4、执行消息循环时获取到此广播,会回调广播接收者(BroadcastReceiver)中的onReceiver()方法。

MyBroadcastReceiver继承BroadcastReceiver成为广播接收者。并且重写onReceive()方法

动态注册

在MainActivity中实例化广播接收者。使用IntentFilter设置要过滤的广播

receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(receiver,intentFilter);

接收者的注销

unregisterReceiver(receiver);

静态注册

AndroidManifest.xml中注册

<application>
    <receiver android:name=".MyReceiver" 
              android:enable="true" 是否可实例化
              android:exported="true">是否接收当前程序之外的广播
    </receiver>
</application>

在Android8.0后,无法使用静态注册。

广播的类型

  1. 无序

    使用sendBroadcast()方法发送,接受和执行顺序不确定。无法被拦截。

  2. 有序

    使用sendOrderedBroadcast()方法发送,按照优先级顺序依次接收,广播只会被优先级最高接收者拦截,然后根据逻辑执行决定是否需要传递。

  3. 优先级的设置

    intentFilter.setPriority(1000)

九、服务

Myserver继承Server成为一个服务。并且需要重写onBind()方法。

AndroidManifext.xml中注册

<application>
    <service android:name=".Myserver" 
              android:enable="true" 是否可实例化
              android:exported="true">是否被其他应用中的组件调用或交互
    </service>
</application>

启用方式

服务的两种启动方式,startServicebindService

生命周期

  1. startService:startService->onCreate()->onStartCommand()->onDestroy()
  2. bindService:bindService->onCreate()->onBind()->onUnbind()->onDestroy()
  • onCreate:第一次创建服务时执行的方法。
  • onStartCommand:调用startService()方法启动服务时执行的方法。
  • onBind():调用bindService()方法启动服务时执行的方法
  • onUnbind():调用unBindService()方法断开服务时执行的方法
  • onDestroy():服务被销毁时执行的方法。

startService使用startService(intent)启动服务,stopService(intent)关闭服务

bindService使用bindService(intent,myconn,BIND_AUTO_CREATE)绑定服务,使用unbindService(myconn)解绑服务

通信

  1. 本地服务通信

    触发Service中的onBind()返回IBinder对象,使用IBinder对象通信

  2. 远程服务通信

    通过AIDL(Android Interface Denfinition Language),

    • 源代码以.aidl结尾
    • 除了基本类型,使用时需要导包

十、事件处理

  1. 键盘事件
  2. 触摸事件

Activity回调方法:(重写以下方法,可改变键盘和触摸事件触发处理逻辑)

  • onKeyDown(int keyCode,KenyEvent event):按键按下
  • onKeyUp(int keyCode,KenyEvent event):按键弹起
  • onTouchEvent(MotionEvent event):触摸
  • onFocusChanged(MotionEvent event):焦点改变

监听器的事件处理

事件监听的处理模型:

  • Event Source(事件源):触发事件的控件
  • Event(事件):触发的事件(按下,触摸)等。
  • Event Listener(事件监听器):负责监听事件源发生的事件。

![事件处理过程(https://img.haomeiwen.com/i14899865/5d021a23f6076cb2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

监听器接口

  • OnClickListener:控件点击
  • OnLongClickListener:控件长按
  • OnFocusChangeListener:焦点改变
  • OnKeyListener:键盘输入
  • OnTouchListner:手机屏幕触摸

手势

识别手势类:GestureLibrary

手势监听组件:GestureOverlayView

  • OnGesturePerformedListener:监听单击、滑动、长按等手势
  • OnDoubleTapListener:监听双击和单击手势
  • OnContextClickListener:监听鼠标/触摸板右击手势
  • SimpleOnGestureListener:实现前三个接口中的所有回调方法。

Handle消息机制

  1. Message:可以携带少量的信息在不同线程间交换,what字段可以携带一些整型数据,obj字段可以携带一个Object对象。
  2. Handler:用于发送和处理消息。使用sendMessage()发送消息。处理消息回调handlerMessage()
  3. MessageQueue:消息队列,通过sendMessage的消息都会在队列中等待着handlerMessage()处理
  4. Looper:消息队列管家,取出MessageQueue中的消息,分发到Hanlder的handlerMessage方法中

十一、网络编程

<uses-permission android:name="android.permission.INTERNET" />

HttpURLConnectionHttpsURLConnection都继承于URLConnection

  1. 创建URL对象
  2. 使用URL.openConnection()获取HttpURLConnection
  3. 调用HttpURLConnection.setConnectiTimeout设置连接超时时间
  4. 调用HttpURLConnection.setRequestMethod设置请求方式
  5. 设置其他参数HttpURLConnection.setRequestProperty
  6. 获取输出流HttpURLConnection.getOutputStream()和outputStream.write来写入数据
  7. 获取输入流HttpURLConnection.getInputStream()来获取返回结果
  8. 调用disconnect关闭http连接

JSON解析使用JSONObjectJSONArray

httpclien和httpUrlConnection

JSONObject处理

JSONObject obj = getJSONObject();
String name = obj.optString("name");
int age = obj.optInt("age");
boolean married = obj.optBoolean("married");

JSONArray处理

JSONArray array = getJSONArray();
for(int i=0;i<array.length();i++){
    JSONObject obj = array.getJSONObject(i);
    String name = obj.optString("name");
    int age = obj.optInt("age");
    boolean married = obj.optBoolean("married");
}

十三、图形图像处理

  1. Bitmap:表示一个位图
  2. BitmapFactory:用作读取资源解析为位图
  3. Paint:用来描述线宽、颜色、透明度、填充效果。
  4. Canvas:可使用Paint来根据Rect绘画指定位置宽高的画布

自定义View

  • 继承View后重写onDraw(Canvas canvas)
  • 使用canvas.drawBitmap()方法绘制到界面上
  • 在layout文件中加入该view,标签为全类名

补间动画

  • AlphaAnimation:透明度渐变动画,参数解释P273

    <!--透明度渐变-->
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha
            android:interpolator="@android:anim/linear_interpolator"
            android:repeatMode="reverse"
            android:repeatCount="infinite"
            android:duration="1000"
            android:fromAlpha="1.0"
            android:toAlpha="0.0"/>
    </set>
    
  • RotateAnimation:旋转动画,参数解释P273

    <!--旋转-->
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <rotate
            android:fromDegrees="0"
            android:toDegrees="360"
            android:pivotX="50%"
            android:pivotY="50%"
            android:repeatMode="reverse"
            android:repeatCount="infinite"
            android:duration="1000"/>
    </set>
    
  • ScaleAnimation:缩放动画,参数解释P274

    <!--缩放-->
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <scale
            android:fromXScale="1.0"
            android:fromYScale="1.0"
            android:toXScale="0.5"
            android:toYScale="0.5"
            android:pivotX="50%"
            android:pivotY="50%"
            android:repeatMode="reverse"
            android:repeatCount="infinite"
            android:duration="3000"/>
    </set>
    
  • TranslateAnimation:平移动画,参数解释P274

    <!--平移-->
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
            android:fromXDelta="0.0"
            android:fromYDelta="0.0"
            android:toXDelta="100"
            android:toYDelta="0.0"
            android:repeatCount="infinite"
            android:repeatMode="reverse"
            android:duration="4000"/>
    </set>
    

逐帧动画

  • 创建一个定义好的帧动画xml文件,android:duration代表该帧停留的时间

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:drawable="@drawable/wifi01" android:duration="300"></item>
        <item android:drawable="@drawable/wifi02" android:duration="300"></item>
        <item android:drawable="@drawable/wifi03" android:duration="300"></item>
        <item android:drawable="@drawable/wifi04" android:duration="300"></item>
        <item android:drawable="@drawable/wifi05" android:duration="300"></item>
        <item android:drawable="@drawable/wifi06" android:duration="300"></item>
    </animation-list>
    
  • 使用ImageView设置android:backgroud为这个帧动画。

  • 在程序中使用findViewById找出这个ImageView。

  • (AnimationDrawable)ImageView.getBackground()选出逐帧动画背景

  • animation.start启动动画

十四、多媒体应用开发

音频类

  1. MediaPlayer类播放音频
  2. SoundPool类播放音频

视频类

  1. VideoView

    <VideoView android:id="@+id/videovie"
               android:layout_width="match_parent"
               android:layout_height="match_parent">
    </VideoView>
    
    videoView.setVideoPath();//播放本地视频
    videoView.setVideoURI();//加载网络视频
    MediaController controller = new MediaController(context);//添加控制器
    videoView.start();
    
  2. MediaPlayer结合SuffaceView

    <SurfaceView android:id="@+id/surfaceview">
    </SurfaceView>
    
    SurfaceView view = (SurfaceView)findViewById();
    SurfaceHolder holder = view.getHolder();
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//数据由MediaPlayer提供,SurfaceView自己不缓存
    
    MediaPlayer mediaplayer = new MediaPlayer();
    mediaplayer.setAudioStreamType(AudioManage.STREAM_MUSIC);//设置视频声音类型
    mediaplayer.setDataSource("视频资源路径");//视频资源路径
    mediaplayer.setDisplay(holder);//SuffaceView与MediaPlayer关联
    mediaplayer.prepareAsync();//将视频文件解析到内存中
    mediaplyaer.start();
    

相关文章

网友评论

      本文标题:android

      本文链接:https://www.haomeiwen.com/subject/yltksktx.html