wufan's blog

首页

关于

loading..
Android

Android中AIDL的工作原理

在上一篇文章中Android中AIDL的使用详解介绍了AIDL的使用流程,这篇文章我们说说AIDL的工作原理。

IPC

在这之前我们先简单说一下IPC,IPC是Inter-Process Communication的缩写,是进程间通信或者跨进程通信的意思,既然说到进程,大家要区分一下进程和线程,进程一般指的是一个执行单元,它拥有独立的地址空间,也就是一个应用或者一个程序。线程是CPU调度的最小单元,是进程中的一个执行部分或者说是执行体,两者之间是包含与被包含的关系。因为进程间的资源不能共享的,所以每个系统都有自己的IPC机制,Android是基于Linux内核的移动操作系统,但它并没有继承Linux的IPC机制,而是有着自己的一套IPC机制。

更多
loading..
Android

Android中AIDL的使用详解

为了说的深入浅出一点,我们先从AIDL的作用和使用说起,然后再开始介绍一些概念和工作原理。

AIDL用来做什么

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。

更多
loading..
Android

Android中全局异常的捕获

应用的crash是让人很蛋疼的问题,在开发测试的时候还能根据日志输出什么的进行排查修复,但是应用发布以后,用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。所以这时候我们就需要一个能全局捕获异常,并且将这个异常信息上传到服务器的功能,以便根据收集到的异常信息,在后期的版本中进行修复,改善用户体验。

更多
loading..
Android

Android中反射的简单应用

自己对反射的理解和应用还处于比较浅显的阶段,写这篇文章更多在于整理总结,也就是帮助自己进一步的理解和学习反射机制。

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

java中类反射

反射是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法
简单总结这些定义,那就是反射可以让我们获得一个类的所有信息,包括私有属性和私有方法,对于我们这种小白,先知道这点就可以啦,那在java中如何使用发射呢。这里我们随便创建一个类来演示。比如说创建一个Book类:

public class Book implements Parcelable
{
    private int id=1;
    private String name="android";

    private String author="wf";

    private String getName()
    {
        return name;
    }
}

更多
Android

Android中退出应用的实现

退出应用是项目开发中很基本的一个需求,这个功能很简单,也有很多实现的方式,这里把自己知道的退出方法做一个整理,跟大家交流分享一下。

更多
loading..
AndroidAndroid Studio

Android-Studio:使用Gradle构建不同版本的APP(构建变体)

Android Studio(我使用的Studio版本是2.0)中有一个构建变体的功能,默认位于左下角

那这个功能是做什么用的呢,一般来说我们在做项目的时候,可能有这样的需求,一个项目中需要有不同版本,比如说免费版,收费版,周年庆版啦等等,这些版本大部分功能和模块是一样的只是部分不同,以前可能是通过svn或者git上建立分支来进行版本控制,但维护起来很麻烦。所以构建变体这个功能用官方的说法就是你可以在一个项目里面构建不同的版本,对,而且打包的时候可以一次性打包所有版本,是不是超级爽。英语好的同学可以看官方的教程Configure Build Variants

更多
Android

WebView加载速度优化

在做混合应用的时候,有几个痛点,一个是无网络无法使用,还有一个是受网络环境影响的网页加载速度。今天就这两个问题,和大家交流一下自己的经验。

离线缓存

这个比较容易,开启webView的缓存功能就可以了。

WebSettings settings = webView.getSettings();
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);//开启DOM缓存,关闭的话H5自身的一些操作是无效的
settings.setCacheMode(WebSettings.LOAD_DEFAULT);

更多
Android

Android中的图片裁剪(一)之系统裁剪工具

应用中图片裁剪的需求是很常见的,在android中裁剪的图片最简单的方法就是调用系统中的裁剪图片应用

Intent intent = new Intent();
intent.setAction("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
startActivityForResult(intent, Constants.REQUEST_CODE_RESIZE_IMAGE);

当然在调用系统的裁剪功能时,我们还可以附加一些其他的信息:

intent.putExtra("outputX", 300);  //裁剪图片的宽
intent.putExtra("outputY", 300);  
intent.putExtra("aspectX", 1);  //裁剪方框宽的比例
intent.putExtra("aspectY", 1);  
intent.putExtra("scale", true);  //是否保持比例
intent.putExtra("return-data", false);  //是否返回bitmap

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  //保存图片到指定uri
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());  //输出格式

上面的是一些常用的附加信息,如果你的outputX和outputY设置的比较大的话,返回的图片可能会导致OOM。最后在onActivityResult中接收图片就可以了

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case CROP_IMAGE_SYS:
            Bitmap bitmap = (Bitmap) data.getParcelableExtra("data");//拿到返回图片
            /*try
            {
             //取的裁剪后保存到本地的图片
              bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
            }
            catch (FileNotFoundException e)
            {
              e.printStackTrace();
            }*/
            //TODO
            break;
//...

当然因为android碎片化严重,不同厂商的系统也有所差异,所以系统的裁剪图片功能也可能有所不同,这也是坑,就像在我的项目中,发现有些手机基于内存考虑对图片缩略了很多,这样裁剪出来的图片分辨率就达不到项目要求,这时候就只能求助于第三方的开源项目或者自定义了,在第二篇文章中Android中的图片裁剪(二),我会说说如何自己实现裁剪图片的功能。

更多
1234