0%

当Android手机(应该是所有的手机都这样)收到短信或者电话时,会自动点亮屏幕,解开屏幕锁,以方便用户即时操作,下面用代码来实现这一功能:

        PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);
        //获取电源管理器对象
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
        //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
        wl.acquire();
        //点亮屏幕
        wl.release();
        //释放

        KeyguardManager  km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        //得到键盘锁管理器对象
        KeyguardLock kl = km.newKeyguardLock("unLock");  
        //参数是LogCat里用的Tag
        kl.disableKeyguard(); 
        //解锁

需要在AndroidManifest.xml添加权限:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

2011年7月19日加注:具体程序中不要直接复制以上的代码,直接复制是无效的(屏幕闪一下)。经过上面的解键盘锁操作以后,屏幕锁也关闭了,不会超时自动锁,所以在具体的程序中,要在执行完所有代码以后,把自动加锁给弄回去(不然屏幕一直开,费电),然后再执行wl.release(),如果不执行wl.release(),屏幕还是会一直亮。整理一下,具体代码应该是这样的:

        PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);
        //获取电源管理器对象
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
        //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
        wl.acquire();
        //点亮屏幕

        KeyguardManager  km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        //得到键盘锁管理器对象
        KeyguardLock kl = km.newKeyguardLock("unLock");  
        //参数是LogCat里用的Tag
        kl.disableKeyguard(); 
        //解锁

        /*
         * 这里写程序的其他代码
         * 
         * */

        kl.reenableKeyguard();
        //重新启用自动加锁
        wl.release();
        //释放

这个问题困扰了我很久,希望对大家有所帮助。

最近有个项目需要在ListView加上CheckBox,如果把ListView的选择模式设为CHOICE_MODE_MULTIPLE多选,在Item的XML里用CheckedTextView,是可以达到加CheckBox的效果,但是CheckedTextView样式太单一,左边的文本只有一行,而我的要求是两行,一行标题,一行描述,只好通过自己加CheckBox解决. 根据前面的经验CheckBox 加入ListView会导致OnItemClick不可用, 在给CheckBox加上android:focusable=”false”属性,实现了需要的功能,但是发现了新问题,无法控制CheckBox的点击事件,ListView只能控制对Item的点击,不能控制对item内的控件的点击,而且在CheckBox上点击也不会触发ListView的 OnItemClick事件,因此在点击CheckBox时无法取拿到CheckBox的值.最终通过另一方法解决,就是禁用CheckBox的点击功能,让它只有显示是否选中的功能,通过监听ListView的OnItemClick事件,来切换CheckBox的显示,效果很完美,几乎跟CHOICE_MODE_MULTIPLE一样. 禁用CheckBox的点击功能:

    <CheckBox android:id="@+id/isRun"
    android:layout_width="wrap_content" 
     android:layout_height="wrap_content"
    style="@style/MyCheckBox"
    android:focusable="false"
    android:clickable="false"
    />

这里我用了自己写的style,MyCheckBox 监听点击事件:

                CheckBox cb=(CheckBox)view.findViewById(R.id.isRun);
                int setrun;
                if(cb.isChecked()){
                    setrun=0;
                    //cb.setChecked(false);
                }else{
                    setrun=1;
                    //cb.setChecked(true);
                }
            	HashMap map = listItem.get(position);
            	map.put("isRun",setrun);
            	listItem.set(position,map);
            listAdapter.notifyDataSetChanged();

这里说明一下,为了方便,我自已写了Adapter,CheckBox传入的是int值,而不是Boolean值,另外在适配器里,因为CheckBox继承自TextView,所以会被识别成TextView,再根据传入的值类型判断即可. 不能用上面注释掉的语句更新视图,因为ListView的Item在隐藏后重新显示(比如说item很多,超出一屏,再拖动ListView),会重新读取传入的HashMap,所以拖动ListView后就又恢复原样了.

Calendar类的compareTo方法可以比较两个Calendar表示的时间的早晚:

        Calendar a= Calendar.getInstance();
        a.set(2011, 05,28, 19,50, 2);
        //参数为年 月 日 时 分 秒
        a.set(Calendar.MILLISECOND, 0);
        //设置毫秒
        Calendar c= Calendar.getInstance();
        c.set(2011, 05,28, 19,50, 3);
        c.set(Calendar.MILLISECOND, 0);
        System.out.println(a.compareTo(c));
        //a比c早,返回-1,
        //a与c相同,返回0
        //a比c晚,返回1

compareTo只能比较两个时间的早晚,并不能比较时差,如果需要得到时差,可以使用getTimeInMillis方法,得到的是距格林威治标准时间的毫秒值,两个值相减,就是时差.

假设我们需要用户输入一些数据,但是用户没输完就点下一步,我们就需要把光标移到用户没输的位置提醒用户在此处输入.这个可以通过设置焦点来实现. android.view.View有个requestFocus方法,可以使该View得到焦点.因为所有的控件都是直接或间接继承View类实现的,所以,所有的控件都可以调用requestFocus方法来实现获取焦点.

java.lang.Math类里有个random()方法,可以随机生成0-1之前的double值,如果你要得到一个0-N之前的整数,只需要把生成的double值乘以N,再强制转换成int型即可.

        double a=Math.random()*100;
        int b=(int)a;
        System.out.print(b);

上面的代码是取0到100的随机值。 但是这个方法只能取得0到N的值,如何取到从N到M的值呢?其实这也很简单,假设N int N=60,M=100; int A=M-N; double B=Math.random()*A; int C=(int)B+N; System.out.print(C);

在Java里,File类有个listFiles方法可以得到指定目录里的所有文件列表,并返回一个File数组。有时我们只需要某些指定类型的文件,比如说jpg图片,listFiles可以通过传入FilenameFilter参数来过滤文件。 FilenameFilter是一个接口,不能直接实例化,所以要先写个类来继承它:

class ImageFilter implements FilenameFilter{
     public boolean isJpg(String filename){    
            if (filename.toLowerCase().endsWith(".jpg")){   
            	//把文件转成小写后看其后缀是否为.jpg
              return true;    
            }else{    
              return false;    
            }    
          }  
    
    @Override
    public boolean accept(File dir, String filename) {
        // TODO Auto-generated method stub
        return isJpg(filename);
        //覆写accept方法
    }
}

接下来,listFiles方法传入ImageFilter的实例:

File f = new File("/sdcard/");
File[] list=f.listFiles(new ImageFilter());

这样,list这个数组里只有jpg图片了。

在C语言里,接收用户输入可以使用scanf,getchar,但getchar只能得到一个字符。 第一种用法,只有输入控制符,只取一个值:

int a;
scanf("%d",&a);
//&a表示取a的地址,如果需要指定输入位数,可以使用%nd,n指位数,自动丢弃n位后的输入,该函数把输入的值赋给a

第二种用法,带非输入控制符,

int a;
scanf("a=%d",&a);
//只有当用户输入a=n,且n为数字时,才是合法的,能取到正确的值,n后有非数字会自动丢弃。

第三种用法,同时取多个值:

int a,b;
scanf("%d %d",&a,&b);
//当用户输入n m,且n,m都为数字时,把n赋给a, m赋给b

用惯了Java,感觉C语言非常不人性化。比如说上面的输入,即使你输入的不是数字,它也不给报错,而是赋了一个很大的的值,但JAVA会直接报错或抛出异常。

因为在Android开发中需要用到NDK,需要会点C语言,而我之前没学过(只学过一学期的C++,但都还给老师了),所以从今天开始学习C语言。干SOHO不容易,什么都要会点,Photoshop、HTML、CSS、JavaScript、PHP、JAVA、C、Android、Linux等等,一个字,累。今天是学习C语言第一天。 因为我之前直接跳过了编程之基础的C语言,现在回头学,感觉有点复杂,没有JAVA来得方便。下面是与JAVA的一些不同。 1、C语言好像没有专门的字符串数据类型,定义字符串需要用char数组,或者char指针,如:

char *d = "asdf";
char e[]="abcd";

2、printf相对于Java的System.out.print要复杂得多。printf不能直接输出变量而是需要输出变量的类型和变量两个参数。Java也有printf函数,但我一般都用print和println,简单一些。 如:

    int a = 15;
    float b = 5.3f;
    printf("a=%d,b=%f",a,b);

上面代码输出的值是a=15,b=5.3f。百分号后的d,f根据输出变量数据类型而变。 输出十进制整型时,用d或i 输出十进制长整型时,用ld 输出无符号的八进制整数时,用o(小写ou) 输出无符号的十进制整数时,用u 输出无符号的十六进制整数时,用x,10到15表示为abcdef,#x会在开头加上0x 输出无符号的十六进制整数时,用X,10到15表示为ABCDEF,#X会在开头加上0X 输出浮点值时,用F或f,double双精度用lf 输出浮点值需要用科学记数法表示时,用E或e 输出单个字符时,用c 输出字符串时,用s 注意,这个是用来表示输出的数据类型,并非输入的数据类型。如上面例子的a,如果在printf里用d,输出就是15,但是如果用o(八进制)输出就是17,程序会自动作转换。 暂时这么多,随时补充

越来越发现PHP这玩意的强大,解析XML竟然可以这么简单。从PHP5开始,PHP集成了simplexml,解析XML相当方便。 下面以我博客的RSS为例,用PHP解析XML,地址为 http://www.pocketdigi.com/feed: 因为文件比较长,内容就不贴了,打开链接看看吧。 下面是解析XML的代码,功能是取出博客标题,和文件标题。

header("Content-type: text/html; charset=utf-8");
//因为wordpress默认编码是utf-8,但IE默认识别为gb2312,所以用header发一下编码
$url="http://www.pocketdigi.com/feed";
$xml =  simplexml_load_file($url);
//载入远程XML文件
$title=$xml->channel->title;
//根据节点获取博客标题(不循环)
echo $title."<br />";
//如果节点循环了,可以用foreach循环取出
foreach($xml->channel->item as $item){
    echo $item->title."<br />";
}
//循环取出文章标题