码迷,mamicode.com
首页 > 移动开发 > 详细

android知识杂记(三)

时间:2015-07-31 16:07:01      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

记录项目中的android零碎知识点,用以备忘。

1、android 自定义权限
  app可以自定义属于自己的权限:

<permission android:description="string resource" 
android:icon="drawable resource" 
android:label="string resource" 
android:name="string" 
android:permissionGroup="string" 
android:protectionLevel=["normal" | "dangerous" | 
"signature" | "signatureOrSystem"] />

其中protectionLevel 为权限等级:
1、normal:默认授予权限不提示用户;
2、dangerous:安装声明此类权限时通知用户;
3、signature:只对使用同一证书签名的APP开放;
4、signatureOrSystem:在signature基础上,在ROM上增加自带APP声明;
诸如:BroadcastReceiver + android:protectionLevel=signature,则只能接受相同签名APP发来的消息;

2、android:process
  默认情况下,android为每一个应用创建一个进程,所有的组件运行于改进程下。进程名字为package名,如com.xx.xx;
  应用有自身独立的内存和资源控件,为了解决单进程的资源限制,android提供了应用内的多进程,比如在复杂绘制,频繁消息监听等独立进程。采用的就是android:process属性。
  <activity>,<service>, <receiver>, 和<provider> 都具备该属性。
  android:process = ":hello"
  android:process = ".hello"
  以":"开头,则表示这个进程是私有的;进程名为com.xx.xx:hello
  以小写字母开头,则表示这是一个全局进程,允许其它应用程序组件也在这个进程中运行,进程名为hello

3、日志模块
  Android提供了较为成熟的日志模块,但在商用软件还用该加以扩展。
    1、在android外部存储中定义日志存储文件路径;
    2、调用日志工具类时,除原生log外,写入文件;
    3、写文件时注意单独起线程,可以利用:
      private static final Executor logger = Executors.newSingleThreadExecutor();
        logger.execute(new Runnable(//日志文件写入)}

4、activity的android:configuration属性

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


5、android 使用getDefaultUncaughtExceptionHandler 获取全局异常
Android的“程序异常退出”,给用户体验造成不良影响,便可继承UncaughtExceptionHandler类来处理,
通过Thread.setDefaultUncaughtExceptionHandler()对异常进行捕获处理。(事实上是java 5.0之后支持的) 代码示例如下:

import java.lang.Thread.UncaughtExceptionHandler;

public class App {
 
  public static void main(String[] args) {
    TestThread a = null;
 
    new TestThread("Fredric Test 1").start();
    new TestThread("Fredric Test 2").start();
    
    /*
     * 输出结果
        This is:Fredric Test 1,Message:/ by zero
        This is:Fredric Test 2,Message:/ by zero
    */
  }
}

class CrashHandler{
    
    private static CrashHandler instance;
    private UncaughtExceptionHandler handler;
    
    private CrashHandler(){
        handler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("This is:" + t.getName() + ",Message:"+ e.getMessage());
                
                handler.uncaughtException(t, e);
            }        
        });
    }
    
    public static CrashHandler getInstance(){
        if(null == instance){
            instance = new CrashHandler();
        }
        
        return instance;
    }
}


class TestThread extends Thread {
 
  public TestThread(String name) {
      this.setName(name);
      
      //在Application的onCreate中调用即可
      CrashHandler.getInstance();
  }
 
  public void run() {
    double i = 10 / 0;// 抛出异常的地方
  }
}

android知识杂记(三)

标签:

原文地址:http://www.cnblogs.com/Fredric-2013/p/4692393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!