Android常用的工具类

来源:互联网 发布:lua for windows 5.2 编辑:程序博客网 时间:2024/05/16 01:09

转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=139064


1、Android拦截短信

  1. 一、AndroidManifest.xml
  2.     <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
  3.     
  4.      <receiver android:name=".SMSReceiver">
  5.             <intent-filter android:priority="1000">
  6.                 <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
  7.                 <category android:name="android.intent.category.DEFAULT" />
  8.             </intent-filter>
  9.         </receiver>
  10.         
  11. 二 、广播类

  12. package com.rekoo.blocksms;

  13. import android.content.BroadcastReceiver;
  14. import android.content.Context;
  15. import android.content.Intent;
  16. import android.os.Bundle;
  17. import android.telephony.SmsMessage;
  18. import android.widget.Toast;


  19. public class SMSReceiver extends BroadcastReceiver {

  20.     @Override
  21.     public void onReceive(Context context, Intent intent) {
  22.         System.out.println("SMSReceiver, isOrderedBroadcast()="
  23.                 + isOrderedBroadcast());
  24.         
  25.         Bundle bundle = intent.getExtras();
  26.         Object messages[] = (Object[]) bundle.get("pdus");
  27.         SmsMessage smsMessage[] = new SmsMessage[messages.length];
  28.         for (int n = 0; n < messages.length; n++) {
  29.             smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
  30.             //如果短信内容包含“123”,则拦截短信。用户收不到短信了。
  31.             if(smsMessage[n].getMessageBody().contains("123")){
  32.                 //退出广播
  33. //                this.abortBroadcast();
  34.                 System.out.println("====222===打印===");
  35.             }
  36.             Toast.makeText(context, "我是11111111", 1).show();
  37.             System.out.println("发件人:"+smsMessage[n].getOriginatingAddress()+" 短信内容:"+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc());
  38.         }
  39.         
  40.     }

  41. }
复制代码
2、手机是否联网?
  1. <!-- 检测网络状态 权限--> 
  2.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  3. package com.rekoo.sms;

  4. import android.content.Context;
  5. import android.net.ConnectivityManager;
  6. import android.net.NetworkInfo;

  7. public class NetHelper {
  8.     /**
  9.      * 是否联网网络
  10.      * */
  11.     public static boolean IsHaveInternet(final Context context) {
  12.         try {
  13.             ConnectivityManager manger = (ConnectivityManager)
  14.                     context.getSystemService(Context.CONNECTIVITY_SERVICE);

  15.             NetworkInfo info = manger.getActiveNetworkInfo();
  16.             return (info!=null && info.isConnected());
  17.         } catch (Exception e) {
  18.             return false;
  19.         }
  20.     }
  21. }
复制代码
3、Application的使用
  1. 一、Application类简介(相当于“全局变量”)

  2.     * Base class for those who need to maintain global application state. You can
  3.     * provide your own implementation by specifying its name in your
  4.     * AndroidManifest.xml's <application> tag, which will cause that class
  5.     * to be instantiated for you when the process for your application/package is
  6.     * created.
  7.     这段话这么翻译或许会通顺些:application类是一个基类,这个基类的作用是为了获取整个应用程序的状态。你可以自己继承或实现这个类,当你要使用自己拓展的application类的时候,只要在manifest.xml中的<application>标签中name应用自己定义的类就行了,这样做的结果是:当你的应用程序或者包所在的进程创建的时候,这个类就会被实例化。
  8.         
  9.     就是说application是用来保存全局变量的,并且是在package创建的时候就跟着存在了。所以当我们需要创建全局变量的时候,不需 要再像j2se那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的getApplicationContext或者Activity的getApplication方法来获得一个application对象,再做出相应 的处理。
  10.     
  11. 二、具体用法

  12.     配置文件:
  13.         <application
  14.             android:allowBackup="true"
  15.             android:icon="@drawable/ic_launcher"
  16.             android:label="@string/app_name"
  17.             android:theme="@style/AppTheme" 
  18.             //加入自定义的Application类
  19.             android:name="com.rekoo.quicktransfer.Applications"
  20.         >

  21.     public class Applications extends Application{
  22.     
  23.         List<AppPackageInfo> appInfos;
  24.         public List<AppPackageInfo> getAppInfos()
  25.         {
  26.             return appInfos;
  27.         }
  28.         public void setAppInfos(List<AppPackageInfo> appInfos)
  29.         {
  30.             this.appInfos = appInfos;
  31.         }
  32.     }
  33.     
  34.     ** 利用Context对象,获取到application对象
  35.     
  36.     1、存取到 appInfos 
  37.     
  38.     ((Applications)WelcomePageActivity.this.getApplication()).setAppInfos(mlistAppInfo);
  39.     
  40.     2、取 appInfos 的值
  41.     
  42.     ((Applications)LogicActivity.this.getApplication()).getAppInfos();
复制代码
4、http请求
  1. private static String baseUrl = "http://59.108.111.76:10001/?";
  2.     private static HttpResponse httpResponse;
  3.     private static HttpEntity httpEntity;
  4.     private static InputStream inputStream;
  5.     
  6.     public static void sendToCode(String authorCode){
  7.         
  8.         String url = baseUrl+"acode="+authorCode;
  9.         System.out.println("url="+url);
  10.         
  11.         try
  12.         {
  13.             int jsonObject_rc = -1;
  14.             //生成一个请求对象
  15.             HttpGet httpPost=new HttpGet(url);
  16.             //生成一个http客户端对象
  17.             HttpClient httpClient=new DefaultHttpClient(); 
  18.             httpResponse=httpClient.execute(httpPost);

  19.             System.out.println("codeStatus:"+httpResponse.getStatusLine().getStatusCode());

  20.             /**请求发送成功,并得到响应**/
  21.             if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
  22.                 httpEntity=httpResponse.getEntity();
  23.                 inputStream=httpEntity.getContent();
  24.                 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
  25.                 String result="";
  26.                 String line="";
  27.                 while((line=bufferedReader.readLine()) != null){
  28.                     result=result+line;
  29.                 }
  30.                 System.out.println("result="+result);
  31.                 
  32.                 /* //======解析 Json数据
  33.                 jsonObject_rc = new JSONObject(result.toString()).getInt("rc");
  34.                 if (jsonObject_rc == 0) {
  35.                     JSONObject jsonObject_data = new JSONObject(result.toString()).getJSONObject("data");
  36.                     //获取子项...
  37. //                    int type = jsonObject_data.getInt("type");
  38.                     int ptype = jsonObject_data.getJSONObject("type").getInt("ptype");
  39.                     int pnum = jsonObject_data.getJSONObject("type").getInt("pnum");
  40.                     System.out.println("====type:num==="+ptype+","+pnum);
  41.                     int num = jsonObject_data.getInt("num");
  42.                     System.out.println("====奖励次数:"+num);
  43.                     
  44.                 }*/
  45.             }else {
  46.                 //连接失败...
  47.                 
  48.             }
  49.         } catch (Exception e) {
  50.             e.printStackTrace();
  51.         }
  52.     }
复制代码
5、int 和 byte[]互转
  1. /**
  2.      * int类型转byte[]类型
  3.      */
  4.     public static byte[] int2ByteArray(int i) {   
  5.         byte[] result = new byte[4];   
  6.         result[0] = (byte)((i >> 24) & 0xFF);
  7.         result[1] = (byte)((i >> 16) & 0xFF);
  8.         result[2] = (byte)((i >> 8) & 0xFF); 
  9.         result[3] = (byte)(i & 0xFF);
  10.         return result;
  11.     }
  12.     /** 
  13.      * 将4字节的byte数组转成int值 
  14.      */  
  15.     public static int byteArray2int(byte[] b){  
  16.         byte[] a = new byte[4];  
  17.         int i = a.length - 1,j = b.length - 1;  
  18.         for (; i >= 0 ; i--,j--) {//从b的尾部(即int值的低位)开始copy数据  
  19.             if(j >= 0)  
  20.                 a[i] = b[j];  
  21.             else  
  22.                 a[i] = 0;//如果b.length不足4,则将高位补0  
  23.         }  
  24.         int v0 = (a[0] & 0xff) << 24;//&0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位  
  25.         int v1 = (a[1] & 0xff) << 16;  
  26.         int v2 = (a[2] & 0xff) << 8;  
  27.         int v3 = (a[3] & 0xff) ;  
  28.         return v0 + v1 + v2 + v3;  
  29.     }
复制代码
6、int和String互转
  1. 1》String.valueOf(i)
  2. 2》 Integer.toString(i)
  3. 3》 i+""
复制代码
7、int转为像素值
  1. private int getPixels(int dpValue) {
  2.         Resources r = activity.getResources();
  3.         int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
  4.                 dpValue, r.getDisplayMetrics());
  5.         return px;
  6.     }
复制代码
8、Java多线程编程环境中单例模式的实现
  1. 【常用的单例模式】

  2. class RekooSDk{
  3. private static RekooSDk instance;
  4. private RekooSDk(){

  5.     }
  6. public static Singleton getInstance(){          
  7.     if (instance == null)          
  8.         synchronized(instance){          
  9.             if(instance == null)          
  10.                 instance = new RekooSDk();          
  11.         }          
  12.     return instance;           
  13. }  
  14. }
  15.          让我们来看一下这个代码是如何工作的:首先当一个线程发出请求后,会先检查instance是否为null,如果不是则直接返回其内容,这样避免了进入synchronized块所需要花费的资源。其次,即使第2节提到的情况发生了,两个线程同时进入了第一个if判断,那么他们也必须按照顺序执行synchronized块中的代码,第一个进入代码块的线程会创建一个新的Singleton实例,而后续的线程则因为无法通过if判断,而不会创建多余的实例。
  16.          上述描述似乎已经解决了我们面临的所有问题,但实际上,从JVM的角度讲,这些代码仍然可能发生错误。
  17.          对于JVM而言,它执行的是一个个Java指令。在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。这样就使出错成为了可能,我们仍然以A、B两个线程为例:
  18. 1.         A、B线程同时进入了第一个if判断
  19. 2.         A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
  20. 3.         由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
  21. 4.         B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
  22. 5.         此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
  23.       通过内部类实现多线程环境中的单例模式
  24. 为了实现慢加载,并且不希望每次调用getInstance时都必须互斥执行,最好并且最方便的解决办法如下:

  25. Java代码 
  26. public class Singleton{          
  27.     private Singleton(){          
  28.         …          
  29.     }          
  30.     private static class SingletonContainer{          
  31.         private static Singleton instance = new Singleton();          
  32.     }          
  33.     public static Singleton getInstance(){          
  34.         return SingletonContainer.instance;          
  35.     }          
  36. }       
  37.     JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心3.2中的问题。此外该方法也只会在第一次调用的时候使用互斥机制,这样就解决了3.1中的低效问题。最后instance是在第一次加载SingletonContainer类时被创建的,而SingletonContainer类则在调用getInstance方法的时候才会被加载,因此也实现了惰性加载。
复制代码
9、long转String
  1. Long.toString(long);
复制代码
10、MD5加密
  1. import java.security.MessageDigest;


  2. public class Md5
  3. {

  4.     /**
  5.      * MD5加密
  6.      * 约定字符串:"zhaonimei!@#AMN"
  7.      */
  8.     public static void main(String[] args)
  9.     {    
  10.         String str = "713F813742FA7FAE7A10505CDDA4321" + "zhaonimei!@#AMN";
  11.         String test = MD5(str);
  12.         System.out.println("加密后:"+test);
  13.     }
  14.     
  15.     //加密
  16.     public static String MD5(String inStr) {   
  17.           MessageDigest md5 = null;   
  18.           try {   
  19.            md5 = MessageDigest.getInstance("MD5");   
  20.           } catch (Exception e) {   
  21.            System.out.println(e.toString());   
  22.            e.printStackTrace();   
  23.            return "";   
  24.           }   
  25.           char[] charArray = inStr.toCharArray();   
  26.           byte[] byteArray = new byte[charArray.length];   
  27.           
  28.           for (int i = 0; i < charArray.length; i++)   
  29.            byteArray[i] = (byte) charArray[i];   
  30.           
  31.           byte[] md5Bytes = md5.digest(byteArray);   
  32.           
  33.           StringBuffer hexValue = new StringBuffer();   
  34.           
  35.           for (int i = 0; i < md5Bytes.length; i++) {   
  36.            int val = ((int) md5Bytes[i]) & 0xff;   
  37.            if (val < 16)   
  38.             hexValue.append("0");   
  39.            hexValue.append(Integer.toHexString(val));   
  40.           }   
  41.           
  42.           return hexValue.toString();   
  43.          }   

  44. }
复制代码
11、Random随机数公式
  1. 产生Min-Max之间的数字
  2.    实现原理:
  3.       Math.round(Math.random()*(Max-Min)+Min);
复制代码
12、String 转 int
  1. int key = Integer.parseInt(string);
复制代码
13、Android发短信
  1. 权限:
  2.     <!-- 短信相关的权限 -->
  3.     <uses-permission android:name="android.permission.SEND_SMS"/>
  4.     <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 
  5.     <uses-permission android:name="android.permission.READ_SMS"></uses-permission>



  6. /**
  7.     * 发送短信
  8.     * destinationAddress:收信人的手机号码
  9.     * scAddress:发信人的使命召唤2中文版使命召唤之联合进攻已经打上了免CD补丁手机号码
  10.     * text:发送信息的内容
  11.     * sentIntent:发送是否成功的回执,用于监听短信是否发送成功
  12.     * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功
  13.     */
  14.     public static void sendSMS(Context context){
  15.         //发送内容
  16.         String smstext = "短信内容";
  17.         //测试...
  18.         System.out.println("smstext="+smstext);
  19.         
  20.         Intent sentIntent = new Intent("SENT_SMS_ACTION");
  21.         PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,0);
  22.         Intent deliverIntent = new Intent("DELIVERED_SMS_ACTION");
  23.         PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);
  24.         
  25.         SmsManager smsManager = SmsManager.getDefault(); 
  26.         smsManager.sendTextMessage(Constant.connectNum, null, smstext, sentPI, deliverPI);
  27.         
  28.     }
复制代码
14、获取手机mac地址
  1. /**
  2.      * 获取mac地址
  3.      * */
  4.     public static String getLocalMacAddress(Context context) {
  5.         WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
  6.         WifiInfo info = wifi.getConnectionInfo();
  7.         return info.getMacAddress();
  8.     }
复制代码
15、获取meta-data的值
  1. 应用Sence:

  2.     <application
  3.         android:allowBackup="true"
  4.         android:icon="@drawable/ic_launcher"
  5.         android:label="@string/app_name"
  6.         android:theme="@style/AppTheme" >
  7.         
  8.         <meta-data android:value="40080001" android:name="DIANXIN_CHANNEL"/>
  9.         .
  10.         .
  11.         .
  12.     </application>
  13.     

  14. 方法:

  15.         /**
  16.          * 获取到 meta-data的数据
  17.          * */
  18.         private static String getMetaData(Context context){
  19.             ApplicationInfo appInfo;
  20.             try
  21.             {
  22.                 appInfo = context.getPackageManager()
  23.                         .getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA);
  24.                 int msg=appInfo.metaData.getInt("DIANXIN_CHANNEL");
  25.                 System.out.println("msg="+msg);
  26.                 return String.valueOf(msg);
  27.             }
  28.             catch (NameNotFoundException e)
  29.             {
  30.                 e.printStackTrace();
  31.             }
  32.             return "未找到";
  33.         }
复制代码
16、时间戳
  1. System.currentTimeMillis();
复制代码
17、解析Json数据
  1. 格式:{"rc":0,"data":{"openid":x,"token":x},"code":{"type":{"num":5}}}

  2. //rc节点
  3. int rc = new JSONObject(result.toString()).getInt("rc");

  4. //data节点
  5. JSONObject jsonObject_data = new JSONObject(result.toString()).getJSONObject("data");

  6. //openid节点
  7. String openid =  jsonObject_data.getInt("openid");

  8. //num节点
  9. JSONObject jsonObject_data = new JSONObject(result.toString()).getJSONObject("code");
  10. int num =jsonObject_data.getJSONObject("type").getInt("num");
复制代码
18、消息队列+Asynctask+Callback
  1. 一、Socket使用
  2.     
  3. 1、Socket客户端,发送请求,启用子线程执行(使用BlockingQueue阻塞消息队列控制)

  4.      //1、定义消息队列
  5.     public static BlockingQueue<Integer> QUEUE = new LinkedBlockingQueue<Integer>();
  6.     
  7.     //2、放入消息队列值
  8.     Constants.QUEUE.put(num);

  9.     public class SendSockets extends Thread{
  10.         @Override
  11.         public void run(){
  12.             
  13.             while(true){
  14.             //3、阻塞消息队列(如果QUEUE不为空,取出执行之后操作)
  15.             int num = Constants.QUEUE.take();
  16.             
  17.             }
  18.             
  19.         }
  20.     }

  21. 2、Socket服务端,用Asynctask实现多线程接受(doInBackground子线程,onProgressUpdate主线程更新UI)    
  22.     
  23.     public class ReceiveSocket extends AsyncTask<String, String, Boolean>{
  24.         
  25.         //运行于子线程中
  26.         @Override
  27.         protected Boolean doInBackground(String... params){
  28.             while(true){
  29.                 
  30.                 //...Socket接受返回来的消息
  31.                 
  32.                 args_in:为获取到的消息内容
  33.                 
  34.                 //1、发送消息到主线程
  35.                 publishProgress(args_in);
  36.                 
  37.             }
  38.         }
  39.         //运行于主线程,用于更新主线程数据(UI)
  40.         @Override
  41.         protected void onProgressUpdate(String... values)
  42.         {
  43.             //2、...操作,更新主线程
  44.             
  45.             super.onProgressUpdate(values);
  46.             //回调callback
  47.             isSuccess(args_in, callback);
  48.         }
  49.     }
  50.     
  51.     * 关于Asynctask的详解
  52.     1、onPreExecute()
  53.     高负载代码执行之前调用 ,通常用来显示一个进度条,在主线程中执行
  54.     2、doInBackGround() 
  55.      onPreExecute() 执行完后调用,此方法通常就是放高负载代码的,比如远程请求,巨大数据载入等,你不用新建线程来包装此方法 AsyncTask(或子类)会自动在新线程中调用此方法
  56.     3、onPostExecute(Result)
  57.     在doInBackground完成之后调用,一般是设置结果,取消第一个方法显示的进度条。
  58.     4、onProgressUpdate() 
  59.     一般用来更新第一个方法显示的进度条,什么下载了50% 51% 。。。 
  60.     
  61. 二、Callback回调

  62.     1、新建接口
  63.     public interface Callback{
  64.         void success(String success);
  65.         void fail(String fail);
  66.     }
  67.     
  68.     2、作为参数,传进执行回调的方法内 //匿名类
  69.         ShareToQQ.Share(new Callback(){
  70.                     @Override
  71.                     public void success(String success)
  72.                     {
  73.                         super.success(success);
  74.                         //success为回调回来的内容
  75.                         System.out.println("回调的数据:"+success);
  76.                     }
  77.                     @Override
  78.                     public void fail(String fail)
  79.                     {
  80.                         super.fail(fail);
  81.                     }
  82.                 });
  83.     4、Share方法的实现
  84.     
  85.         public void Share(Callback callback){
  86.             callback.success("成功...");
  87.         }
复制代码
19、页数公式
  1. 页数 = (总数+PAGE_SIZE-1)/PAGE_SIZE
复制代码
20、用keystore给apk签名
  1. 用jdk自带工具jarsigner.exe 

  2. 命令行到 
  3. C:\Program Files\Java\jdk1.6.0_24\bin>jarsigner.exe -verbose -keystore d:\aa\debug.kestore -storepass android -signedjar d:\aa\gblnn_signed.apk d:\aa\gblnn.apk androiddebugkey

  4. 规范:
  5. >jarsigner.exe -verbose -keystore keystore文件路径 -storepass 密码 -signedjar 要生成的新apk路径 待签名的apk路径 alias名称(为希望使用的签名证书中的alias名称)
复制代码
0 0