工具类(饿狼巨献)

1、Android拦截短信

复制代码 一、AndroidManifest.xml <uses-permission android:name="android.permission.RECEIVE_SMS"/>

 <receiver android:name=".SMSReceiver">
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

二 、广播类

package com.rekoo.blocksms;

import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    System.out.println("SMSReceiver, isOrderedBroadcast()="
            + isOrderedBroadcast());
    
    Bundle bundle = intent.getExtras();
    Object messages[] = (Object[]) bundle.get("pdus");
    SmsMessage smsMessage[] = new SmsMessage[messages.length];
    for (int n = 0; n < messages.length; n++) {
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
        //如果短信内容包含“123”,则拦截短信。用户收不到短信了。
        if(smsMessage[n].getMessageBody().contains("123")){
            //退出广播

// this.abortBroadcast(); System.out.println("====222===打印==="); } Toast.makeText(context, "我是11111111", 1).show(); System.out.println("发件人:"+smsMessage[n].getOriginatingAddress()+" 短信内容:"+smsMessage[n].getMessageBody()+" "+smsMessage[n].getIndexOnIcc()); }

}

} 复制代码 2、手机是否联网?

复制代码

<!-- 检测网络状态 权限-->

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

package com.rekoo.sms;

import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo;

public class NetHelper { /** * 是否联网网络 * */ public static boolean IsHaveInternet(final Context context) { try { ConnectivityManager manger = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo info = manger.getActiveNetworkInfo();
        return (info!=null && info.isConnected());
    } catch (Exception e) {
        return false;
    }
}

} 复制代码 3、Application的使用

复制代码 一、Application类简介(相当于“全局变量”)

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

二、具体用法

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

public class Applications extends Application{

    List<AppPackageInfo> appInfos;
    public List<AppPackageInfo> getAppInfos()
    {
        return appInfos;
    }
    public void setAppInfos(List<AppPackageInfo> appInfos)
    {
        this.appInfos = appInfos;
    }
}

** 利用Context对象,获取到application对象

1、存取到 appInfos 

((Applications)WelcomePageActivity.this.getApplication()).setAppInfos(mlistAppInfo);

2、取 appInfos 的值

((Applications)LogicActivity.this.getApplication()).getAppInfos();

复制代码 4、http请求

复制代码

private static String baseUrl = "http://59.108.111.76:10001/?";
private static HttpResponse httpResponse;
private static HttpEntity httpEntity;
private static InputStream inputStream;

public static void sendToCode(String authorCode){
    
    String url = baseUrl+"acode="+authorCode;
    System.out.println("url="+url);
    
    try
    {
        int jsonObject_rc = -1;
        //生成一个请求对象
        HttpGet httpPost=new HttpGet(url);
        //生成一个http客户端对象
        HttpClient httpClient=new DefaultHttpClient(); 
        httpResponse=httpClient.execute(httpPost);

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

        /**请求发送成功,并得到响应**/
        if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
            httpEntity=httpResponse.getEntity();
            inputStream=httpEntity.getContent();
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
            String result="";
            String line="";
            while((line=bufferedReader.readLine()) != null){
                result=result+line;
            }
            System.out.println("result="+result);
            
            /* //======解析 Json数据
            jsonObject_rc = new JSONObject(result.toString()).getInt("rc");
            if (jsonObject_rc == 0) {
                JSONObject jsonObject_data = new JSONObject(result.toString()).getJSONObject("data");
                //获取子项...

// int type = jsonObject_data.getInt("type"); int ptype = jsonObject_data.getJSONObject("type").getInt("ptype"); int pnum = jsonObject_data.getJSONObject("type").getInt("pnum"); System.out.println("====type:num==="+ptype+","+pnum); int num = jsonObject_data.getInt("num"); System.out.println("====奖励次数:"+num);

            }*/
        }else {
            //连接失败...
            
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

复制代码 5、int 和 byte[]互转

复制代码 /** * int类型转byte[]类型 / public static byte[] int2ByteArray(int i) {
byte[] result = new byte[4];
result[0] = (byte)((i >> 24) & 0xFF); result[1] = (byte)((i >> 16) & 0xFF); result[2] = (byte)((i >> 8) & 0xFF); result[3] = (byte)(i & 0xFF); return result; } /
* * 将4字节的byte数组转成int值 */
public static int byteArray2int(byte[] b){
byte[] a = new byte[4];
int i = a.length - 1,j = b.length - 1;
for (; i >= 0 ; i--,j--) {//从b的尾部(即int值的低位)开始copy数据
if(j >= 0)
a[i] = b[j];
else
a[i] = 0;//如果b.length不足4,则将高位补0
}
int v0 = (a[0] & 0xff) << 24;//&0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位
int v1 = (a[1] & 0xff) << 16;
int v2 = (a[2] & 0xff) << 8;
int v3 = (a[3] & 0xff) ;
return v0 + v1 + v2 + v3;
} 复制代码 6、int和String互转

1》String.valueOf(i) 2》 Integer.toString(i) 3》 i+"" 7、int转为像素值

private int getPixels(int dpValue) { Resources r = activity.getResources(); int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, r.getDisplayMetrics()); return px; } 8、Java多线程编程环境中单例模式的实现

复制代码 【常用的单例模式】

class RekooSDk{ private static RekooSDk instance; private RekooSDk(){

}

public static Singleton getInstance(){
if (instance == null)
synchronized(instance){
if(instance == null)
instance = new RekooSDk();
}
return instance;
}
} 让我们来看一下这个代码是如何工作的:首先当一个线程发出请求后,会先检查instance是否为null,如果不是则直接返回其内容,这样避免了进入synchronized块所需要花费的资源。其次,即使第2节提到的情况发生了,两个线程同时进入了第一个if判断,那么他们也必须按照顺序执行synchronized块中的代码,第一个进入代码块的线程会创建一个新的Singleton实例,而后续的线程则因为无法通过if判断,而不会创建多余的实例。 上述描述似乎已经解决了我们面临的所有问题,但实际上,从JVM的角度讲,这些代码仍然可能发生错误。 对于JVM而言,它执行的是一个个Java指令。在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。这样就使出错成为了可能,我们仍然以A、B两个线程为例:

  1.     A、B线程同时进入了第一个if判断
    
  2.     A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
    
  3.     由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
    
  4.     B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
    
  5.     此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
    

4 通过内部类实现多线程环境中的单例模式 为了实现慢加载,并且不希望每次调用getInstance时都必须互斥执行,最好并且最方便的解决办法如下:

Java代码 public class Singleton{
private Singleton(){

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

Long.toString(long); 10、MD5加密

复制代码 import java.security.MessageDigest;

public class Md5 {

/**
 * MD5加密
 * 约定字符串:"zhaonimei!@#AMN"
 */
public static void main(String[] args)
{    
    String str = "713F813742FA7FAE7A10505CDDA4321" + "zhaonimei!@#AMN";
    String test = MD5(str);
    System.out.println("加密后:"+test);
}

//加密
public static String MD5(String inStr) {   
      MessageDigest md5 = null;   
      try {   
       md5 = MessageDigest.getInstance("MD5");   
      } catch (Exception e) {   
       System.out.println(e.toString());   
       e.printStackTrace();   
       return "";   
      }   
      char[] charArray = inStr.toCharArray();   
      byte[] byteArray = new byte[charArray.length];   
      
      for (int i = 0; i < charArray.length; i++)   
       byteArray[i] = (byte) charArray[i];   
      
      byte[] md5Bytes = md5.digest(byteArray);   
      
      StringBuffer hexValue = new StringBuffer();   
      
      for (int i = 0; i < md5Bytes.length; i++) {   
       int val = ((int) md5Bytes[i]) & 0xff;   
       if (val < 16)   
        hexValue.append("0");   
       hexValue.append(Integer.toHexString(val));   
      }   
      
      return hexValue.toString();   
     }   

} 复制代码 11、Random随机数公式

产生Min-Max之间的数字 实现原理: Math.round(Math.random()*(Max-Min)+Min); 12、String 转 int

int key = Integer.parseInt(string); 13、Android发短信

复制代码 权限: <!-- 短信相关的权限 --> <uses-permission android:name="android.permission.SEND_SMS"/> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <uses-permission android:name="android.permission.READ_SMS"></uses-permission>

/** * 发送短信 * destinationAddress:收信人的手机号码 * scAddress:发信人的使命召唤2中文版使命召唤之联合进攻已经打上了免CD补丁手机号码 * text:发送信息的内容 * sentIntent:发送是否成功的回执,用于监听短信是否发送成功 * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功 */ public static void sendSMS(Context context){ //发送内容 String smstext = "短信内容"; //测试... System.out.println("smstext="+smstext);

    Intent sentIntent = new Intent("SENT_SMS_ACTION");
    PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,0);
    Intent deliverIntent = new Intent("DELIVERED_SMS_ACTION");
    PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,deliverIntent, 0);
    
    SmsManager smsManager = SmsManager.getDefault(); 
    smsManager.sendTextMessage(Constant.connectNum, null, smstext, sentPI, deliverPI);
    
}

复制代码 14、获取手机mac地址

复制代码 /** * 获取mac地址 * */ public static String getLocalMacAddress(Context context) { WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); } 复制代码 15、获取meta-data的值

复制代码 应用Sence:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    
    <meta-data android:value="40080001" android:name="DIANXIN_CHANNEL"/>
    .
    .
    .
</application>

方法:

    /**
     * 获取到 meta-data的数据
     * */
    private static String getMetaData(Context context){
        ApplicationInfo appInfo;
        try
        {
            appInfo = context.getPackageManager()
                    .getApplicationInfo(context.getPackageName(),PackageManager.GET_META_DATA);
            int msg=appInfo.metaData.getInt("DIANXIN_CHANNEL");
            System.out.println("msg="+msg);
            return String.valueOf(msg);
        }
        catch (NameNotFoundException e)
        {
            e.printStackTrace();
        }
        return "未找到";
    }

复制代码 16、时间戳

System.currentTimeMillis(); 17、解析Json数据

复制代码 格式:{"rc":0,"data":{"openid":x,"token":x},"code":{"type":{"num":5}}}

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

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

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

//num节点 JSONObject jsonObject_data = new JSONObject(result.toString()).getJSONObject("code"); int num =jsonObject_data.getJSONObject("type").getInt("num"); 复制代码 18、消息队列+Asynctask+Callback

复制代码 一、Socket使用

1、Socket客户端,发送请求,启用子线程执行(使用BlockingQueue阻塞消息队列控制)

 //1、定义消息队列
public static BlockingQueue<Integer> QUEUE = new LinkedBlockingQueue<Integer>();

//2、放入消息队列值
Constants.QUEUE.put(num);

public class SendSockets extends Thread{
    @Override
    public void run(){
        
        while(true){
        //3、阻塞消息队列(如果QUEUE不为空,取出执行之后操作)
        int num = Constants.QUEUE.take();
        
        }
        
    }
}

2、Socket服务端,用Asynctask实现多线程接受(doInBackground子线程,onProgressUpdate主线程更新UI)

public class ReceiveSocket extends AsyncTask<String, String, Boolean>{
    
    //运行于子线程中
    @Override
    protected Boolean doInBackground(String... params){
        while(true){
            
            //...Socket接受返回来的消息
            
            args_in:为获取到的消息内容
            
            //1、发送消息到主线程
            publishProgress(args_in);
            
        }
    }
    //运行于主线程,用于更新主线程数据(UI)
    @Override
    protected void onProgressUpdate(String... values)
    {
        //2、...操作,更新主线程
        
        super.onProgressUpdate(values);
        //回调callback
        isSuccess(args_in, callback);
    }
}

* 关于Asynctask的详解
1、onPreExecute()
高负载代码执行之前调用 ,通常用来显示一个进度条,在主线程中执行
2、doInBackGround() 
 onPreExecute() 执行完后调用,此方法通常就是放高负载代码的,比如远程请求,巨大数据载入等,你不用新建线程来包装此方法 AsyncTask(或子类)会自动在新线程中调用此方法
3、onPostExecute(Result)
在doInBackground完成之后调用,一般是设置结果,取消第一个方法显示的进度条。
4、onProgressUpdate() 
一般用来更新第一个方法显示的进度条,什么下载了50% 51% 。。。 

二、Callback回调

1、新建接口
public interface Callback{
    void success(String success);
    void fail(String fail);
}

2、作为参数,传进执行回调的方法内 //匿名类
    ShareToQQ.Share(new Callback(){
                @Override
                public void success(String success)
                {
                    super.success(success);
                    //success为回调回来的内容
                    System.out.println("回调的数据:"+success);
                }
                @Override
                public void fail(String fail)
                {
                    super.fail(fail);
                }
            });
4、Share方法的实现

    public void Share(Callback callback){
        callback.success("成功...");
    }

复制代码 19、页数公式

页数 = (总数+PAGE_SIZE-1)/PAGE_SIZE 20、用keystore给apk签名

复制代码 用jdk自带工具jarsigner.exe

命令行到 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

规范:

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

转载于:https://my.oschina.net/ITELITE/blog/403611

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值