android代码片段二
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 <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();
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名称)
android代码片段二的更多相关文章
- Android - 代码片段
转载说明 本篇文章可能已经更新,最新文章请转:http://www.sollyu.com/android-code-snippets/ 说明 此篇文章为个人日常使用所整理的一此代码片段,此篇文正将会不 ...
- 【Android代码片段之六】Toast工具类(实现带图片的Toast消息提示)
转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/6841266 作者:张燕广 实现的Toast工具类ToastUtil封装 ...
- 【Android代码片段之八】监听Android屏幕是否锁屏
实现方法:1)通过BroadcastReceiver接收广播Intent.ACTION_SCREEN_ON和Intent.ACTION_SCREEN_OFF可以判断屏幕状态是否锁屏,但是只有屏幕状态发 ...
- 实用的Android代码片段集合(精)
1.精确获取屏幕尺寸(例如:3.5.4.0.5.0寸屏幕) public static double getScreenPhysicalSize(Activity ctx) { DisplayMetr ...
- 给大家介绍几个常见的Android代码片段
今天在源码天堂那个网站,也下载了一个不错的Android源码特效,现在分享一下给博客园的朋友吧,个人觉得那个网站还是挺不错的,希望大家能够使用得上. 仿美图秀秀拼图功能源码 仿美图秀秀拼图功能源码,最 ...
- android代码片段一
1.Android判断是Pad或者手机 public boolean isTabletDevice() { TelephonyManager telephony = (TelephonyManager ...
- arx代码片段
ObjectARX代码片段二 转载自网络 一 在ARX中禁用AutoCAD的某个命令 以LINE命令为例,在程序中加入下面的一句即可禁用LINE命令: acedCommand(RTSTR, &q ...
- Android课程---Android Studio使用小技巧:提取方法代码片段
这篇文章主要介绍了Android Studio使用小技巧:提取方法代码片段,本文分享了一个快速复制粘贴方法代码片段的小技巧,并用GIF图演示,需要的朋友可以参考下 今天来给大家介绍一个非常有用的Stu ...
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段(转)
摘自:http://blog.csdn.net/shakespeare001/article/details/7926783 Adapter是连接后端数据和前端显示的适配器接口,是数据Data和UI( ...
随机推荐
- 【转】并发编程之Operation Queue
http://blog.xcodev.com/blog/2013/10/28/operation-queue-intro/ 随着移动设备的更新换代,移动设备的性能也不断提高,现在流行的CPU已经进入双 ...
- codeforces 630H (组合数学)
H - Benches Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit S ...
- python challenge第1关--NoteBook上的“乱码”
在 python challenge第0关中已经得到第1关的地址了: http://www.pythonchallenge.com/pc/def/map.html 一.观察地址栏和标签: What a ...
- POJ 1088 滑雪 (记忆化搜索)
题目链接:http://poj.org/problem?id=1088 题意很好懂,就是让你求一个最长下降路线的长度. dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j ...
- 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(二)
本文转载自 http://blog.csdn.net/cutesource/article/details/6192145 下面再来看看Tomcat是如何使用NIO来构架Connector这块的. 先 ...
- poj3041
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12162 Accepted: 6620 Descri ...
- rqnoj-390-地震了!-动态规划
一步步的往前走,判断当前状态与上一个状态的关闭. 注意,题目输入的楼层的速度是从小到大,而实际运用的楼层顺序是从大到小.. #include<stdio.h> #include<al ...
- C#编程简短总结
封装 field一般为private,定义的时候可以不赋值.不赋值的时候一般被构造函数初始化赋值,其值用来保存类实例的数据,可以被内部方法使用作为计算的数据来源.当需要继承类继承本类的时候,field ...
- C++成员变量、构造函数的初始化顺序
一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...
- angurlajs 如何绑定Jquery
//绑定Jqueryfunction bindJQuery() { // bind to jQuery if present; jQuery = window.jQuery;//获取windows 的 ...