Android常用功能

来源:互联网 发布:东南亚旅游推荐 知乎 编辑:程序博客网 时间:2024/06/01 08:21
     
1、Android获取屏幕分辨率
 WindowManager windowManager = getWindowManager();
      Display display = windowManager.getDefaultDisplay();
      screenWidth = display.getWidth();
      screenHeight = display.getHeight();

2、listview添加了一张图片作为背景,在滑动列表时背景就不见了,如何解决?
ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,
原因是,滚动时,列表里面的view重绘时,用的依旧是系统默认的透明色,颜色值为#FF191919,
要改变这种情况,只需要调用listView的setCacheColorHint(0),颜色值设置为0
或者xml文件中listView的属性 Android:cacheColorHint="#00000000"即可,
滚动时,重绘View的时候就不会有背景颜色。
android:listSelector="#00000000"
进行上面的设置之后,ListView点击item时就没有任何现象了,
android:listSelector="@null"不可以实现。

android.os.NetworkOnMainThreadException 异常处理 

在2.2的平台上运行不会报错,但是运行在高版本的平台上会报错,
通过查阅相关资料,发现,自从Android 2.3之后,系统增加了一个类:StrictMode。这个类对网络的访问方式进行了一定的改变。

StrictMode通常用于捕获磁盘访问或者网络访问中与主进程之间交互产生的问题,因为在主进程中,UI操作和一些动作的执行是最经常用到的,它们之间会产生一定的冲突问题。将磁盘访问和网络访问从主线程中剥离可以使磁盘或者网络的访问更加流畅,提升响应度和用户体验。

显然,大多数初学者在进行网络开发时,会选择将访问网络的代码直接放到主进程中,由于和主进程的首要工作——UI交互——相矛盾,因此,必须设置一定的检测机制,以保证系统运行的流畅,所有的异常都可以被检测。

StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
                     .detectDiskReads()
                     .detectDiskWrites()
                     .detectNetwork()  // or .detectAll() for all detectable problems
                     .penaltyLog()
                     .build());
             StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
             .detectLeakedSqlLiteObjects()//探测SQLite数据库操作
             .penaltyLog()//打印logcat
             .penaltyDeath()
             .build());

Android文档建议我们增加这两条命令:

android定时器的使用

timer = new Timer(true);
timer.schedule(task,10001000); //延时1000ms后执行,1000ms执行一次
 //timer.cancel(); //退出计时器


TimerTask task = new TimerTask(){ 
       public void run() { 
       Message message = new Message();     
       message.what = 1;     
       handler.sendMessage(message);   
    } 
};

这样 run函数就会被定时执行,

android在进入第一个activity之前会显示一个带有标题栏的空白界面然后再进入第一个activity?

解决办法:在manifest文件中的application标签下添加主题
android:theme="@android:style/Theme.Light.NoTitleBar",这样就不会显示标题栏了,虽然去掉了标题栏,但是还会有那个一闪而过的空白界面

java.lang.IllegalStateException: TimerTask is scheduled already原因

将创建task和timer对象的代码都放在onstart函数中

再按一次退出程序代码

private long exitTime = 0;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){           if((System.currentTimeMillis()-exitTime) > 2000){              Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                            exitTime = System.currentTimeMillis();           } else {            finish();            System.exit(0);        }        return true;       }    return super.onKeyDown(keyCode, event);}

android 动态添加控件

首先需要得到文件映射的对象
inflater = LayoutInflater.from(this);
调用映射方法
LinearLayout  layout=  (LinearLayout) inflater.inflate(R.layout.linearLayout_view, null);
得到布局后,既可以对布局中的控件进行修改又可以像布局中添加控件


android多线程绘图需要注意的问题
Canvas c=holder.lockCanvas();
即得到一个canvas,如果是由主线程生成的子线程来执行该段代码,那么在主activity在stop状态时执行将会得不到canvas而抛异常


android图标常用颜色




android中资源在java代码中访问外部资源,例如layout、drawable、等
控件资源可以利用findViewById(R.id.viewName)
如果想得到一个字符串或者颜色的资源,需要利用
getResources().getColor(R.color.colorName);获取
 
 
为什么利用view.getHeight,view.getWidth获取的值是0,?
只有调用了控件的onDraw方法后,才能确定控件的宽高,可以在onCreate函数中添加下面的代码
    ViewTreeObserver vto = surfaceView.getViewTreeObserver();          
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
        {
            public boolean onPreDraw()
            {
                if (hasMeasured == false)
                {
               
                }
                return true;
            }
        });


Android 中如何动态指定控件位置?

imageView.setPadding( ImageView.getPaddingLeft()+100,  imageView.getPaddingTop(),  imageView.getPaddingRight(),  imageView.getPaddingBottom());}
这样就会将控件向左移动100pix,如果是ImageView控件可以将src属性设置为图片源,如果将background设置为图片源,那么设置内边距会有问题,因为背景设置为图片的画会导致控件随着设置的内边距自动扩展

该位置是针对父控件的来指定内边距的

获取手机系统的信息


"Product: " + android.os.Build.PRODUCT;
        phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI;
        phoneInfo += ", TAGS: " + android.os.Build.TAGS;
        phoneInfo += ", VERSION_CODES.BASE: " + android.os.Build.VERSION_CODES.BASE;
        phoneInfo += ", MODEL: " + android.os.Build.MODEL;
        phoneInfo += ", SDK: " + android.os.Build.VERSION.SDK;
        phoneInfo += ", VERSION.RELEASE: " + android.os.Build.VERSION.RELEASE;
        phoneInfo += ", DEVICE: " + android.os.Build.DEVICE;
        phoneInfo += ", DISPLAY: " + android.os.Build.DISPLAY;
        phoneInfo += ", BRAND: " + android.os.Build.BRAND;
        phoneInfo += ", BOARD: " + android.os.Build.BOARD;
        phoneInfo += ", FINGERPRINT: " + android.os.Build.FINGERPRINT;
        phoneInfo += ", ID: " + android.os.Build.ID;
        phoneInfo += ", MANUFACTURER: " + android.os.Build.MANUFACTURER;
        phoneInfo += ", USER: " + android.os.Build.USER;


如何读取raw中的文本文件

文件内容
xmppHost=10.0.0.204
xmppPort=5222

读取文件
props.load(this.getResources().openRawResource(R.raw.hello));

获得文件中的值
props.getProperty("xmppHost", "127.0.0.1");
props.getProperty("xmppPort", "5222");

android sharedPrefs用法
很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。
sharedPrefs最终是以XML文件的形式保存在 /data/data/PACKAGE_NAME /shared_prefs 目录下。

整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少

下面代码实现向SharedPreferences中添加键值对,如果不存在则创建文件

SharedPreferences pre = getSharedPreferences("share", Context.MODE_PRIVATE);Editor editor = pre.edit();editor.putString("first", "one");editor.commit();
获取存储的数据
SharedPreferences pre2 = getSharedPreferences("share", Context.MODE_PRIVATE);
String str = pre2.getString("first", "defaultValue");


如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<packagename>为com.scl.action的应用使用下面语句创建了preference。

getSharedPreferences("test",Context.MODE_WORLD_READABLE);

其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :

ContextotherAppsContext= createPackageContext("com.scl.action",Context.CONTEXT_IGNORE_SECURITY);

SharedPreferencessharedPreferences= otherAppsContext.getSharedPreferences("test",Context.MODE_WORLD_READABLE);

Stringname = sharedPreferences.getString("username","");

intage = sharedPreferences.getInt("age",0);

如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:

File xmlFile =new File(“/data/data/<package name>/shared_prefs/test.xml”);//<packagename>应替换成应用的包名



自定义 Service时可以继承Service或者 IntentService

graphic
继承 Service时,如果是耗时较长的操作,那么需要声明一个新的线程来执行,并且执行完后需要自己 stopService
继承 IntentService会自动生成一个新的线程,并且会创建一个与该线程绑定的任务队列,调用该service后会自动将 intent放入任务队列,然后传递给onHandlerIntent 方法,而且一次只传一个 intentonHandlerIntent 方法,并且会自动调用 stopService方法,也不用担心多线程会造成的问题。
继承IntentService需要有构造函数
 public HelloIntentService() {      super("HelloIntentService");  }