Android常用的工具类
来源:互联网 发布:lua for windows 5.2 编辑:程序博客网 时间:2024/05/16 01:09
转自:http://www.apkbus.com/forum.php?mod=viewthread&tid=139064
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());
- }
-
- }
- }
- <!-- 检测网络状态 权限-->
- <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;
- }
- }
- }
- 一、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 <application> 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();
- 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();
- }
- }
- /**
- * 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;
- }
- 1》String.valueOf(i)
- 2》 Integer.toString(i)
- 3》 i+""
- private int getPixels(int dpValue) {
- Resources r = activity.getResources();
- int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
- dpValue, r.getDisplayMetrics());
- return px;
- }
- 【常用的单例模式】
- 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实例,却发现它没有被初始化,于是错误发生了。
- 通过内部类实现多线程环境中的单例模式
- 为了实现慢加载,并且不希望每次调用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方法的时候才会被加载,因此也实现了惰性加载。
- Long.toString(long);
- 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();
- }
- }
- 产生Min-Max之间的数字
- 实现原理:
- Math.round(Math.random()*(Max-Min)+Min);
- int key = Integer.parseInt(string);
- 权限:
- <!-- 短信相关的权限 -->
- <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);
-
- }
- /**
- * 获取mac地址
- * */
- public static String getLocalMacAddress(Context context) {
- WifiManager wifi = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
- WifiInfo info = wifi.getConnectionInfo();
- return info.getMacAddress();
- }
- 应用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 "未找到";
- }
- System.currentTimeMillis();
- 格式:{"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");
- 一、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("成功...");
- }
- 页数 = (总数+PAGE_SIZE-1)/PAGE_SIZE
- 用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名称)
0 0
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- Android常用的工具类
- android常用的工具类
- Android常用的工具类
- 常用Android工具类
- Android常用的工具类-收藏用
- Android常用的工具类-收藏用
- Secure CRT 乱码
- Unix下Qt环境变量设置
- HDU-2277 Change the ball
- python
- Vi常用命令
- Android常用的工具类
- 最大报销额 (HDU 1864)解题报告(DP - 01 - 背包)
- [Thinking in Java]15.泛型
- EAS应付单无法反审核处理方法
- C语言基础-进制、原反补码、位运算
- 015_C语言中文件操作
- 基于eclipse和hiber的pojo、数据库表与mapping的相互转换(二)
- Unity符国新:3D技术将渗透到生活的各个方面
- jQuery学习笔记(五)