android

2020-08-27  本文已影响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()

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回调方法:(重写以下方法,可改变键盘和触摸事件触发处理逻辑)

监听器的事件处理

事件监听的处理模型:

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

监听器接口

手势

识别手势类:GestureLibrary

手势监听组件:GestureOverlayView

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

补间动画

逐帧动画

十四、多媒体应用开发

音频类

  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();
    
上一篇 下一篇

猜你喜欢

热点阅读