0%

今天发现InputStream不能复制,没有实现Cloneable接口,当一次read后,就不存在了,但我的程序必须要读两次,于是我想了个方法,在read的同时,输出到ByteArrayOutputStream,读完了,再把ByteArrayOutputStream转成InputStream。

ByteArrayOutputStream os=new ByteArrayOutputStream();
byte buf[] = new byte[1024];
//省略循环
int numread = is.read(buf);
os.write(buf, 0, numread);
InputStream is2 = new ByteArrayInputStream(os.toByteArray());

因为之前考虑不够周到,把APP的官方主页放到了droidwork.net域名下,这个域名是没备案的,只能放国外,但是国外主机的速度还是差了点。因为前段时间很忙,而且原来基于dedecms做的网站我本身也不是很满意,加上我希望可以给用户讨论的功能,于是装了个discuz。装了以后才发现,discuz树大招风,我已经设置了注册必须邮箱验证,注册后一小时才能发贴,但是每天都有几百条spam,正常用户发贴却少得可怜…..想想还是自己写个系统好。花了几天时间,自己写了个简单的应用发布平台,集版本更新(配合客户端,可以自动推送新版本)、应用发布功能于一体,正好复习一下N久没碰的PHP,不开放留言,有意见邮件联系。以后有新的应用都会在平台发布.http://app.pocketdigi.com

在启动服务service或者停止服务service之前,需要先判断服务是否正在运行,再决定是否启动或停止服务,启动之前如果已经启动,会造成系统资源不必要的浪费,结束之前没有启动,则会使程序异常。下面是一个判断服务是否正在运行的方法,传入参数一个是调用该方法的Activity的context,另一个是完整的服务名,包括包名。

public  boolean isRunning(Context c,String serviceName)
{
    ActivityManager myAM=(ActivityManager)c.getSystemService(Context.ACTIVITY_SERVICE); 
    
    ArrayList runningServices = (ArrayList) myAM.getRunningServices(40);
    //获取最多40个当前正在运行的服务,放进ArrList里,以现在手机的处理能力,要是超过40个服务,估计已经卡死,所以不用考虑超过40个该怎么办
    for(int i = 0 ; i

其实Java 使用HttpURLConnection下载的的时候,会自动下载重定向后的文件,但是我们无法获知目标文件的真实文件名,文件类型,用下面的方法可以得到真实的URL,下面是一个YOUKU视频的例子。

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class Test2 {
    public static void main(String[] args) throws Exception {
        String str="http://f.youku.com/player/getFlvPath/sid/130258503437697_01/st/flv/fileid/03000201004DA277E47AC503E2C7936B543E15-DFED-EE85-31E0-869A7BE2F5B8?K=457eb55affadc5c5161b9af9&hd=0";
        URL url = new URL(str);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.getResponseCode();
        String realUrl=conn.getURL().toString();
        conn.disconnect();
        System.out.println("真实URL:"+realUrl);

    }

}

import java.util.ArrayList;

public class Test2 {
    public static void main(String[] args) throws Exception {
        AllList al=new AllList();
        al.add("a","aa");
        al.add("b","bb");
        al.add("c", "cc");
        for(int i=0;i   list1   =   new   ArrayList(); //存放数据,为了简便, 这里用String,如果只是String其实可以直接用indexOf得到index
    ArrayList   list2   =   new   ArrayList(); //作为Key,索引
    ArrayList>   alllist   =   new   ArrayList>(); 
    AllList(){
    alllist.add(list1); 
    alllist.add(list2); 
    }
    public void add(String s1,String s2){
        list1.add(s1);
        list2.add(s2);
        alllist.set(0,list1);
        alllist.set(1,list2);
    }
    public void remove(String s2){
        int index=list2.indexOf(s2);
        list1.remove(index);
        list2.remove(index);
        alllist.set(0,list1);
        alllist.set(0, list2);
    }
    public void edit(String s,String s2){
        int index=list2.indexOf(s);
        
        list1.set(index, s2);
        alllist.set(0,list1);
    }
    public int size(){
        return list1.size();
    }
    public ArrayList> getList(){
        return alllist;
    }
    
}

连接: 连接USB设备(手机):adb -d shell 连接模拟器:adb -e shell,如果有连接多个USB设备先用adb devices查看连接的设备的ID,再adb -s ID shell 开启Root权限(模拟器不需要): 默认情况下,连接后在命令行开头显示$,这里输入su,手机上弹出一对话框,点允许,$变成#,成功开启Root权限,需要手机已经Root 另外: 一般情况下,手机是没有带sqlite3的,无法操作数据库,但RootExplorer有查看sqlite数据库功能,找到数据库文件,打开即可,一般为/data/data/包名/databases/数据库文件名 仅限查看,需要编辑可以装个SQLite Editor

按一定的格式输出日期,数字等

int a=3;
float f=254.2f;
DecimalFormat format=new DecimalFormat("000");//不足三位加0补足,超过三位格式化
DecimalFormat format2=new DecimalFormat("000.000");
System.out.println(format.format(a));//输出003
System.out.println(format2.format(f));//输出254.200

一般情况下,为了省电,我们都会把手机屏幕调得比较暗,但是如果程序是一个视频播放器,把亮度调高点播放效果会更好。下面的方法并不会修改系统设置里的亮度设置,它仅仅是在调用这个方法的Activity显示时调整屏幕亮度,当退出Activity时,屏幕亮度会恢复原来系统设置的值。

    public void setBrightness(float f){
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = f;   
        pd=new ProgressDialog(this);
        getWindow().setAttributes(lp);
    }

参数f为0到1的浮点值,0为最暗,1为最亮.

需要在不同的Activity中传送数据,可以在原Activity用Intent跳转到新Activity的时候,附加上数据,然后在新的Activity中就可以接收到。 下面以main跳转到NA为例: main.java中代码:

            Intent intent=new Intent();
            //生成一个Intent对象
            intent.setClass(main.this, NA.class);
            //本Activity为main,目标Activity为NA
            intent.putExtra("et1", et1.getText().toString());
            //et1是一个文本输入框,et2也是一样
            intent.putExtra("et2",et2.getText().toString());
            main.this.startActivity(intent);
            //启动跳转

NA.java接收数据:

        Intent intent=getIntent();
        //取得传过来的Intent
        String et1=intent.getStringExtra("et1");
        String et2=intent.getStringExtra("et2");
        //获取et1,et2数据
        TextView tv=(TextView)findViewById(R.id.tv2);
        tv.setText("et1="+et1+"   et2="+et2);
        //将结果显示在tv2这个TextView中

传送数据还可以用Bundle,用法差不多,参见Android开发中插入新的Activity 如果需要传送是的是个对象,则必须用Bundle:

typeVideo tv_play=new typeVideo();
Intent intent = new Intent();
intent.setClass(context,VideoPlayer.class);
Bundle bundle=new Bundle();
bundle.putSerializable("tv_play",tv_play);
intent.putExtras(bundle);
context.startActivity(intent);

typeVideo类必须实现Serializable接口,如果typeVideo有用到其他类的对象,则该类也需要实现Serializable接口。 接收:

typeVideo tv_play=(typeVideo)getIntent().getSerializableExtra("tv_play");

今天被这个问题搞得头都大了,一直用等于号赋值,今天发现一些莫名其妙的错误,看了好多文章才发现,原来对象赋值不能用等于号,等于只能用于主类型的赋值(String,int,float之类),而如果是其他的类生产的对象,用等于号是映射,并非赋值,只要改了等号一边的值,另一边的也跟着变化,就是说JAVA没有开辟新的内存,只是给原来的对象再起了个名字而已。 如果需要赋值,就需要类实现Cloneable接口,实现clone()方法。

class D implements Cloneable{//实现Cloneable接口
    String sex;
    D(String sex){
        this.sex=sex;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // 实现clone方法
        return super.clone();
    }
}

赋值的时候:

D d=new D("男");
D d2=(D) d.clone();//把d赋值给d2

如果类中的变量不是主类型,而是对象,也需要调用该对象的clone()方法 下面是一个完整的例子:

public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        D d=new D("男");
        C c=new C("张三","20",d);
        C new_c=(C) c.clone();//调用clone方法来赋值
        new_c.name="李四";
        d.sex="女";//d
        System.out.println(c.d.sex);
        System.out.println(c.name);
        
    }

}

class C implements Cloneable{
    String name;
    String age;
    D d;
    C(String name,String age,D d) throws CloneNotSupportedException{
        this.name=name;
        this.age=age;
        this.d=(D) d.clone();//调用clone方法来赋值,这样即便外部的d发生变化,c里的也不会变
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
}
class D implements Cloneable{//实现Cloneable接口
    String sex;
    D(String sex){
        this.sex=sex;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // 实现clone方法
        return super.clone();
    }
}