Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370798
  • 博文数量: 107
  • 博客积分: 927
  • 博客等级: 大尉
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-13 17:50
文章分类

全部博文(107)

文章存档

2014年(2)

2013年(13)

2012年(16)

2011年(76)

分类: Java

2011-05-30 16:33:12

DownloadManager是Android为开发者提供的一个后台应用组件,它通过Http层进行文件的下载任务.
    1:使用
         首先要在AndroidManifest.xml中申请访问DownloadManager的权限
         
         添加一个下载任务:
         ContentValues values = new ContentValues();
         values.put(Downloads.URI, url);//指定下载地址
        values.put(Downloads.COOKIE_DATA, cookie);//如果下载Server需要cookie,设置cookie
        values.put(Downloads.VISIBILITY,Downloads.VISIBILITY_HIDDEN);//设置下载提示是否在屏幕顶部显示 
        values.put(Downloads.NOTIFICATION_PACKAGE, getPackageName());//设置下载完成之后回调的包名 
        values.put(Downloads.NOTIFICATION_CLASS, DownloadCompleteReceiver.class.getName());//设置下载完成之后负责接收的Receiver,这个类要继承BroadcastReceiver      
        values.put(Downloads.DESTINATION,save_path);//设置下载到的路径,这个需要在Receiver里自行处理
        values.put(Downloads.TITLE,title);//设置下载任务的名称
        this.getContentResolver().insert(Downloads.CONTENT_URI, values);//将其插入到DownloadManager的数据库中,数据库会触发修改事件,启动下载任务


   2:如何为DownloadManager设置代理,比如Wap
             values.put(Downloads.PROXY_HOST,"10.0.0.172");
            values.put(Downloads.PROXY_PORT,"80");


  3:如何在下载过程中监听下载任务
     可以通过监听数据库来实现
    DownloadsChangeObserver mDownloadObserver=new DownloadsChangeObserver(Downloads.CONTENT_URI);
    private class DownloadsChangeObserver extends ContentObserver {
        public DownloadsChangeObserver(Uri uri) {
            super(new Handler());
        }
        @Override
        public void onChange(boolean selfChange) {
            //查询需要监听的字段
           //比如要监听实时下载进度,查看当前下载状态:是否已经断开,或者下载失败等等
           StringBuilder wherequery = new StringBuilder(Downloads.TITLE);
            wherequery.append("=");
            wherequery.append("'"); 
            wherequery.append(mTitle);
            wherequery.append("'");

           mDownloadCursor =mContext.getContentResolver().query(Downloads.CONTENT_URI, new String[] {Downloads.TITLE, Downloads.STATUS, Downloads.CURRENT_BYTES,}, wherequery.toString(), null,orderBy);         
            int mSizeColunmId=mDownloadCursor.getColumnIndexOrThrow(Downloads.CURRENT_BYTES);    
           mDownloadCursor.moveToFirst();     
            int size=mDownloadCursor.getInt(mSizeColunmId);
       }

  4:如何删除下载记录
    private void deleteHistory(String title)//删除掉指定名称的下载记录
    {  
        StringBuilder whereDelete = new StringBuilder(Downloads.TITLE);
        whereDelete.append("=");
        whereDelete.append("'");
        whereDelete.append(str); 
        whereDelete.append("'"); 
        this.getContentResolver().delete(Downloads.CONTENT_URI,whereDelete.toString(), null);
    }   
 

在Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行.

 方法: 在操作之前加入

            PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
            wakeLock.acquire(); 

别忘了在操作完毕之后释放掉

      if (wakeLock != null) {
                wakeLock.release();
                wakeLock = null;
            }
 

Java中的weak reference 和 soft reference

如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。

 java.lang.ref.WeakReference 

  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的reference

  A obj = new A();

    WeakReference wr = new WeakReference(obj);

    obj = null;

    //等待一段时间,obj对象就会被垃圾回收
  
  ... 

  if (wr.get()==null) { 
  
  
  System.out.println("obj 已经被清除了 "); 
  
  
  } else { 
  
  System.out.println("obj 尚未被清除,其信息是 "+obj.toString());
  
  }
  
  ... 
  在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。 

  这类的技巧,在设计 Optimizer  Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。 

  java.lang.ref.SoftReference 

  Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。

 

    A obj = new A();

    SoftRefenrence sr = new SoftReference(obj);

 

    引用时

    if(sr!=null){

        obj = sr.get();

    }else{

        obj = new A();

        sr = new SoftReference(obj);

    }
Android下四种Layout

FrameLayout

FrameLayout是 最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定 在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡 住(除非后一个子元素是透明的)。

LinearLayout

LinearLayout以 你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素,而不管他们有多 宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素 的右对齐、中间对齐或者左对齐)。 

LinearLayout还 支持为单独的子元素指定weight。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们 放大填充空白。子元素指定一个weight值,剩余的空间就会按这些子元素指定的weight比例分配给这些子元素。默认的weight值为0。例如,如 果有三个文本框,其中两个指定了weight值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大。

下 面的两个窗体采用LinearLayout,包含一组的元素:一个按钮,几个标签,几个文本框。两个窗体都为布局做了一番修饰。文本框的width被设置 为FILL_PARENT;其它元素的width被设置为WRAP_CONTENT。默认的对齐方式为左对齐。左边的窗体没有设置weight(默认为 0);右边的窗体的comments文本框weight被设置为1。如果Name文本框也被设置为1,那么Name和Comments这两个文本框将会有 同样的高度。 

在 一个水平排列的LinearLayout中,各项按他们的文本基线进行排列(第一列第一行的元素,即最上或最左,被设定为参考基线)。因此,人们在一个窗 体中检索元素时,就不需要七上八下地读元素的文本了。我们可以在layout的XML中设置 android:baselineAligned="false",来关闭这个设置。 

TableLayout

TableLayout将子元素的位置分配到行或列中。android的 一个TableLayout由许多的TableRow组成,每个TableRow都会定义一个row(事实上,你可以定义其它的子对象,这在下面会解释 到)。TableLayout容器不会显示row、cloumns或cell的边框线。每个row拥有0个或多个的cell;每个cell拥有一个 View对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML中的不一样。下图显示了一个TableLayout,图 中的虚线代表不可视的单元格边框。 


列可以被隐藏,也可以被设置为伸展的从而填充可利用的屏幕空间,也可以被设置为强制列收缩直到表格匹配屏幕大小。对于更详细信息,可以查看这个类的参考文档。 

AbsoluteLayout

AbsoluteLayout可 以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout没有页边 框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用AbsoluteLayout,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至 于在不同的设备上可能不能很好地工作。 

RelativeLayout

RelativeLayout允 许子元素指定他们相对于其它元素或父元素的位置(通过ID指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列, 因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用XML来指定这个layout,在你定义它之前, 被关联的元素必须定义。 

这是一个RelativeLayout例子,其中有可视的和不可视的元素。基础的屏幕layout对象是一个RelativeLayout对象。

这 个视图显示了屏幕元素的类名称,下面是每个元素的属性列表。这些属性一部份是由元素直接提供,另一部份是由容器的LayoutParams成员 (RelativeLayout的子类)提供。RelativeLayout参数有 width,height,below,alignTop,toLeft,padding和marginLeft。注意,这些参数中的一部份,其值是相对 于其它子元素而言的,所以才RelativeLayout。这些参数包括toLeft,alignTop和below,用来指定相对于其它元素的左,上和 下的位置。

Android横竖屏切换的解决方法

在开发游戏的时候,有些 游戏是只能横屏玩的,所以手机竖立放置的时候,要保持游戏画面依然横屏。要做到这个要求其实很简单,在AndroidManifest.xml里面配置一 下就可以了。加入这一行android:screenOrientation="landscape"。

例如(landscape是横向,portrait是纵向):

ava代码

  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.       package="com.ray.linkit"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     "@drawable/icon" android:label="@string/app_name">  
  7.         ".Main"  
  8.                   android:label="@string/app_name"  
  9.                   android:screenOrientation="portrait">  
  10.               
  11.                 "android.intent.action.MAIN" />  
  12.                 "android.intent.category.LAUNCHER" />  
  13.               
  14.           
  15.                 ".GamePlay"  
  16.                 android:screenOrientation="portrait">  
  17.                 ".OptionView"  
  18.                 android:screenOrientation="portrait">  
  19.       
  20.     "3" />  
  21.    

另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
Anroid使用DefaultHttpClient访问Wap网络

访问中国移动的Wap网络需要设置代理:    Host:"10.0.0.172"  Port:80
   在Android中,有两种不同的HttpClient类,一个是Java.net包中的:HttpURLConnection,它设置代理代码如下:
          Proxy proxy=new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("10.0.0.172",80));
          HttpURLConnection connection=(HttpURLConnection) url.openConnection(proxy);
   还有一个是Apache的HttpClient:
       DefaultHttpClient httpclient = new DefaultHttpClient(); 
        HttpHost proxy = new HttpHost("10.0.0.172", 80); 
        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXYproxy); 
Android的Dalvik虚拟机

1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik
虚拟机实例,其代码在虚拟机的解释下得以执行。
3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex
4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的擦偶哦。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的诉据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

怎样开发适应不同分辨率的Android应用

Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢?
   其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

阅读(2439) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~