当前位置:  编程技术>移动开发
本页文章导读:
    ▪简略recorder        简单recorder //activity package com.example.recorder_audio; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Calendar;import java.uti.........
    ▪ rexsee文档和api使用groovy爬上来分享给大家        rexsee文档和api使用groovy爬下来分享给大家 见附件,源码我另外格式化了下   最近学习android,对rexsee比较感兴趣,因为公司不能浏览外网,所以文档都看不上,今天晚上一时兴起, 写写代码.........
    ▪ 对象池-恒量池       对象池-----常量池 对象池    ---------------常量池注意注意:::八种基本数据类型  int short long float double byte char boolean    的包装类   就Double  Float这两个包装类没有对象池,其它的都有.........

[1]简略recorder
    来源: 互联网  发布时间: 2014-02-18
简单recorder

//activity

package com.example.recorder_audio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;

import com.example.recorder_audio.PlayRecorderService.PlayBinder;
import com.example.recorder_audio.RecorderAudioService.RecorderBinder;

import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.text.format.DateFormat;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener
{

    private Button recordAudio;
    private Button stop;
    private Button play;
    private File file;
    private RecorderBinder recorderBinder;
    private ServiceConnection conn=new ServiceConnection()
    {
       

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
        }
       
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
           recorderBinder =(RecorderBinder)service;
        }
    };
    private PlayBinder playBinder;
    private ServiceConnection conn2=new ServiceConnection()
    {
       

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
        }
       
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            playBinder=(PlayBinder)service;           
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iniService();
       recordAudio =(Button) findViewById(R.id.button1);
       stop =(Button) findViewById(R.id.button2);
       play =(Button) findViewById(R.id.button3);
       recordAudio.setOnClickListener(this);
       stop.setOnClickListener(this);
       play.setOnClickListener(this);
    }

    private void iniService()
    {
      Intent intent=new Intent(this, RecorderAudioService.class);
      bindService(intent, conn, BIND_AUTO_CREATE); 
      Intent intent2=new Intent(this, PlayRecorderService.class);
      bindService(intent2, conn2, BIND_AUTO_CREATE); 
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public void onClick(View v)
    {
       switch (v.getId())
    {
    case R.id.button1:
        recordAudio();
        break;
    case R.id.button2:
        stop();
        break;
    case R.id.button3:
        play();
        break;

    default:
        break;
    }       
    }

    private void play()
    {
       playBinder.play(file.getAbsolutePath());
    }

    private void recordAudio()
    {
        file = new File("/sdcard/"  + "wuxifu.amr");
        try
        {
            file.createNewFile();//自己要先建好一个文件
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

                Toast.makeText(getApplicationContext(), "正在录音,录音文件在"+file.getAbsolutePath(), Toast.LENGTH_LONG) .show();
                recorderBinder.record(file.getAbsolutePath());
                recordAudio.setText("录音中……"); 

               

    }

    private void stop()
    {
        recorderBinder.stop();
        recordAudio.setText("录音完毕!!!");
    }
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        //解绑服务
        unbindService(conn);
        unbindService(conn2);
    }

}
//录音的service

package com.example.recorder_audio;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Binder;
import android.os.IBinder;

public class RecorderAudioService extends Service
{
    private MediaRecorder mediaRecorder;
    private RecorderBinder recorderBinder;
    public RecorderAudioService()
    {
    }
    class RecorderBinder extends  Binder
    {

        public void record(String path)
        {
            // 从麦克风源进行录音
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
         // 设置输出格式
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            // 设置编码格式 Call this after setOutputFormat() but before prepare().
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            // 设置输出文件
            mediaRecorder.setOutputFile(path);
            // 准备录制
            try
            {
                mediaRecorder.prepare();
                // 开始录制
                mediaRecorder.start();
            }
            catch (IllegalStateException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          
           
        }

        public void stop()
        {
         mediaRecorder.stop();           
        }
           
    }
    @Override
    public void onCreate()
    {
        super.onCreate();
        mediaRecorder = new MediaRecorder();
        recorderBinder = new RecorderBinder();
    }
    @Override
    public IBinder onBind(Intent intent)
    {
        return recorderBinder;
    }
}
//播放 的service

package com.example.recorder_audio;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

public class PlayRecorderService extends Service
{
    private MediaPlayer mediaPlayer;
    private PlayBinder playBinder;
    public PlayRecorderService()
    {
    }
    class PlayBinder  extends  Binder
    {

        public void play(String absolutePath)
        {
            try
            {
                mediaPlayer.reset(); //这句很重要,重置对象,回到初始化创建 的状态
                mediaPlayer.setDataSource(absolutePath);
                mediaPlayer.prepare();
                mediaPlayer.start();
                mediaPlayer.setOnCompletionListener(new OnCompletionListener()
                {
                   
                    @Override
                    public void onCompletion(MediaPlayer mp)
                    {
                       Toast.makeText(PlayRecorderService.this, "播放完毕", Toast.LENGTH_LONG).show();
                    }
                });
            }
            catch (IllegalArgumentException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (SecurityException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IllegalStateException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         
                     
        }
       
    }
    @Override
    public void onCreate()
    {
        super.onCreate();
        mediaPlayer = new MediaPlayer();
        playBinder = new PlayBinder();
    }
    @Override
    public IBinder onBind(Intent intent)
    {
        return   playBinder;
    }
}


    
[2] rexsee文档和api使用groovy爬上来分享给大家
    来源: 互联网  发布时间: 2014-02-18
rexsee文档和api使用groovy爬下来分享给大家

见附件,源码我另外格式化了下

 

最近学习android,对rexsee比较感兴趣,因为公司不能浏览外网,所以文档都看不上,今天晚上一时兴起,

写写代码弄下来,自己用,顺便分享出来。

 

output/index.html

help/index.html

 

PS

rexsee的手册网站的html代码垃圾的很,连个好的前端工程师都不愿意请么??


    
[3] 对象池-恒量池
    来源: 互联网  发布时间: 2014-02-18
对象池-----常量池

对象池    ---------------常量池
注意注意:::八种基本数据类型  int short long float double byte char boolean    的包装类   就Double  Float这两个包装类没有对象池,其它的都有
对象池   
(1)Interger对象池装一个字节的基本数字对象  -128  到  127  这256个对象
如  Integer  i=110;    jvm执行的时候会进行装箱  Integer i=Integer.valueOf(110);    指的对象就是对象  对象池new  Integer(110)的地址;
如  Integer  i2=110;    jvm执行的时候会进行装箱  Integer i2=Integer.valueOf(110);    指的对象就是对象  对象池new  Integer(110)的地址;
所以  i==i2;引用相同      他们是对象不是基本数据类型,记住了
   Integer  i3=new Integer(110);
   Integer  i4=new Integer(110);
   i3!=i4  虽然他们的内容一样但是他们的引用不同,只要new 就会创建一个新的对象,不在对象池中!!!  所以i3==i4是错了,比引用不是比内容
 public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }
   
   
     Integer i1 = 40;
      Integer i2 = 40;
       Integer i3 = 0;
        Integer i4 = new Integer(40);
          Integer i5 = new Integer(40);
            Integer i6 = new Integer(0);
   
    对于i1==i2+i3、i4==i5+i6结果为True,是因为,Java的数学计算是在内存栈里操作的,Java会对i5、i6进行拆箱操作,其实比较的是基本类型(40=40+0),
    他们的值相同,因此结果为True。
   
    (2)Double    Float        就他俩没有对象池           
    Double  d=120.0;
     Double  d2=120.0;
     System.out.println(d==d2);    //false  因为装箱直接new
         Float  f=110f;
         Float  f2=110f;
        System.out.println(f==f2);    //false  因为装箱直接new
      public static Double valueOf(double d) {
        return new Double(d);
    }
     public static Float valueOf(float f) {
        return new Float(f);
    }
    (3)Long    Short   Integer
    Long   l=110L;
     Long   l2=110L;
     System.out.println(l==l2);//true    装箱没有直接new看属于那一个字节的有没有 
           Short  s=110;
           Short  s2=110;
           System.out.println(s==s2);    //true    装箱没有直接new看属于那一个字节的有没有
             Integer  i=110;
             Integer  i2=110;
             System.out.println(i==i2);    //true    装箱没有直接new看属于那一个字节的有没有
     public static Long valueOf(long v) {
        return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
    }
     public static Short valueOf(short s) {
        return s < -128 || s >= 128 ? new Short(s) : SMALL_VALUES[s + 128];
    }
    public static Short valueOf(short s) {
        return s < -128 || s >= 128 ? new Short(s) : SMALL_VALUES[s + 128];
    }
     public static Integer valueOf(int i) {
        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
    }
    (4)Character    Byte
    Character  c='a';
     Character  c2='a';
     Character  c3='你';
     Character  c4='你';
     System.out.println(c==c2);//true    a       字符在对象池中有
     System.out.println(c3==c4);// false 你    字符对象池中没有
            Byte  b=120;
            Byte  b2=120;
            System.out.println(b==b2);//永远true 只有一个字节吗
     public static Character valueOf(char c) {
        return c < 128 ? SMALL_VALUES[c] : new Character(c);
    }
     public static Byte valueOf(byte b) {
        return VALUES[b + 128];
    }
    (5)Boolean
     Boolean   b3=true;
     Boolean   b4=true;
     System.out.println(b3==b4);//永远true  装箱还是老样子啊
     public static Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
    }
    
   

 

(二)常量池       存放字符串常量和基本类型常量(public static final)。
public class test1
 {   
 /**     * @param args     */  
  public static void main(String[] args)
  {
          String a = "a1";
                  String b = "a"+ 1;  
                       System.out.println(a==b);    }//true}

test2:

public class test2
{
    /**     * @param args     */
       public static void main(String[] args)
       {       
       String a = "ab";
              String bb = "b";
                      String b = "a"+ bb;    //编译器不克不及断定为常量  
                           System.out.println(a==b);    }//false}
test3:

 

public class test3
{
   /**     * @param args     */  
    public static void main(String[] args)
    {   
        String a = "ab";    
           final String bb = "b";   
               String b = "a"+ bb;    //bb加final后是常量,可以在编译器断定b  
                    System.out.println(a==b);    }//true}
test4:
public class test4
 {
     /**     * @param args     */   
     public static void main(String[] args)
     {
            String a = "ab"; 
                  final String bb = getBB(); 
                        String b = "a"+ bb;//bb是经由过程函数返回的,固然知道它是final的,但不知道具体是啥,要到运行期才知道bb的值
                               System.out.println(a==b);    }//false    private static String getBB(){ return "b"; }}
test5:

public class test5
 {
     /**     * @param args     */
        private static String a = "ab";
            public static void main(String[] args)
            {       
            String s1 = "a";
                    String s2 = "b";
                            String s = s1 + s2;//+的用法   
                                System.out.println(s == a);
                                        System.out.println(s.intern() == a);//intern的含义    }//flase true}
test6:

public class test6
 {
     /**     * @param args     */ 
       private static String a = new String("ab");
          public static void main(String[] args)
          {     
            String s1 = "a";
                    String s2 = "b";  
                         String s = s1 + s2;
                                 System.out.println(s == a);
                                        System.out.println(s.intern() == a);  
                                             System.out.println(s.intern() == a.intern());    }//flase false true}
-------------------------------------------------------------------------


String常量池详解:

  1.String应用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不克不及再批改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable)。String类有一个特别的创建办法,就是应用""双引号来创建.例如new String("i am")实际创建了2个
  String对象,一个是"i am"经由过程""双引号创建的,另一个是经由过程new创建的.只不过他们创建的时代不合,
  一个是编译期,一个是运行期!java对String类型重载了+操纵符,可以直接应用+对两个字符串进行连接。运行期调用String类的intern()办法可以向String Pool中动态添加对象。
  
  例1
  String s1 = "sss111";
  //此语句同上
  String s2 = "sss111";
  System.out.println(s1 == s2); //成果为true
  例2
  String s1 = new String("sss111");
  String s2 = "sss111";
  System.out.println(s1 == s2); //成果为false
  例3
  String s1 = new String("sss111");
  s1 = s1.intern();
  String s2 = "sss111";
  System.out.println(s1 == s2);//成果为true
  例4
  String s1 = new String("111");
  String s2 = "sss111";
  String s3 = "sss" + "111";
  String s4 = "sss" + s1;
  System.out.println(s2 == s3); //true
  System.out.println(s2 == s4); //false
  System.out.println(s2 == s4.intern()); //true

 

 成果上方解析,总结如下:

  1.零丁应用""引号创建的字符串都是常量,编译期就已经断定存储到String Pool中;

  2,应用new String("")创建的对象会存储到heap中,是运行期新创建的;

  3,应用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能断定,已经断定存储到String Pool中;

  4,应用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中;

  还有几个经常考的口试题:
  
  String s1 = new String("s1") ;
  String s2 = new String("s1") ;
  上方创建了几个String对象?
  答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.(用new创建的每new一次就在堆上创建一个对象,用引号创建的若是在常量池中已有就直接指向,不消创建)

  String s1 = "s1";
  String s2 = s1;
  s2 = "s2";
  s1指向的对象中的字符串是什么?
  答案: "s1"。(永远不要忘了String不成变的,s2 = "s2";实际上s2的指向就变了,因为你不成以去改变一个String,)

--------------------------------------------------------------------------

String是一个特别的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的情势来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后经由过程符号引用去字符串常量池里找有没有"abc",若是没有,则将"abc"存放进字符串常量池,并令str指向”abc”,若是已经有”abc” 则直接令str指向“abc”。

斗劲类里面的数值是否相等时,用equals()办法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子申明上方的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的体式格式是生成不合的对象。每一次生成一个。

因此用第二种体式格式创建多个”abc”字符串,在内存中其实只存在一个对象罢了. 这种写法有利与节俭内存空间. 同时它可以在必然程度上进步法度的运行速度,因为JVM会主动按照栈中数据的实际景象来决意是否有须要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有须要创建新对象,从而加重了法度的肩负。

另一方面, 要重视: 我们在应用诸如String str = "abc";的格局定义类时,老是想当然地认为,创建了String类的对象str。愁闷陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有经由过程new()办法才干包管每次都创建一个新的对象。
因为String类的immutable性质,当String变量须要经常变换其值时,应当推敲应用StringBuffer类,以进步法度效力。
1. 起首String不属于8种根蒂根基数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种特别的对象,有其它对象没有的一些特点。

2. new String()和new String(”")都是申明一个新的空字符串,是空串不是null;

3. String str=”kvill”;String str=new String (”kvill”)的差别

看例1:

String s0="kvill";
String s1="kvill";
String s2="kv" + "ill";
System.out.println( s0==s1 );
System.out.println( s0==s2 );
成果为:
true
true

起首,我们要知成果为道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被断定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它本身必然也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中” kvill”的一个引用。所以我们得出s0==s1==s2;用new String() 创建的字符串不是常量,不克不及在编译期就断定,所以new String() 创建的字符串不放入常量池中,它们有本身的地址空间。

看例2:
String s0="kvill";
String s1=new String("kvill");
String s2="kv" + new String("ill");
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
成果为:
false
false
false

例 2中s0还是常量池中"kvill”的应用,s1因为无法在编译期断定,所所以运行时创建的新对象”kvill”的引用,s2因为有后半项目组 new String(”ill”)所以也无法在编译期断定,所以也是一个新创建对象”kvill”的应用;熟悉打听了这些也就知道为何得出此成果了。

4. String.intern():
再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()办法就是扩充常量池的 一个办法;当一个String实例str调用intern()办法时,Java查找常量池中是否有雷同Unicode的字符串常量,若是有,则返回其的引用,若是没有,则在常量池中增长一个Unicode便是str的字符串并返回它的引用;看例3就清楚了

例3:
String s0= "kvill";
String s1=new String("kvill");
String s2=new String("kvill");
System.out.println( s0==s1 );
System.out.println( "**********" );
s1.intern();
s2=s2.intern(); //把常量池中"kvill"的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
成果为:
false
**********
false //固然履行了s1.intern(),但它的返回值没有赋给s1
true //申明s1.intern()返回的是常量池中"kvill"的引用
true

最后我再废除一个错误的懂得:有人说,“应用 String.intern() 办法例可以将一个 String 类的保存到一个全局 String 表中 ,若是具有雷同值的 Unicode 字符串已经在这个表中,那么该办法返回表中已有字符串的地址,若是在表中没有雷同值的字符串,则将本身的地址注册到表中”若是我把他说的这个全局的 String 表懂得为常量池的话,他的最后一句话,”若是在表中没有雷同值的字符串,则将本身的地址注册到表中”是错的:

看例4:
String s1=new String("kvill");
String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+" "+s2 );
System.out.println( s2==s1.intern() );
成果:
false
kvill kvill
true

在这个类中我们没有申明一个”kvill”常量,所以常量池中一开端是没有”kvill”的,调用s1.intern()后就在常量池中新添加了一个”kvill”常量,本来的不在常量池中的”kvill”仍然存在,也就不是“将本身的地址注册到常量池中”了。
s1==s1.intern()为false申明本来的”kvill”仍然存在;s2如今为常量池中”kvill”的地址,所以有s2==s1.intern()为true。

 

 

 

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3