原文地址:http://blog.csdn.net/yudajun/article/details/9119747

apk代码混淆保护4.0

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
# Project target.
target=android-17

如果有报异常,例如这样,
java.io.IOException: Please correct the above warnings first.
at proguard.Initializer.execute(Initializer.java:308)
at proguard.ProGuard.initialize(ProGuard.java:210)
at proguard.ProGuard.execute(ProGuard.java:85)
at proguard.ProGuard.main(ProGuard.java:499)


这是由于第三方jar包的原因哦,

你可以这样,
${sdk.dir}\tools\proguard\proguard-android.txt中加入
-dontwarn com.aa.bb.*

-keep class com.aa.bb.*{ *;}

判断指定的服务是否运行:

[java] view plain copy
  1. publicstaticbooleanisServiceRunning(Contextctx,StringserviceName,StringprocessName){
  2. ActivityManagermanager=(ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
  3. for(RunningServiceInfoservice:manager.getRunningServices(Integer.MAX_VALUE)){
  4. if(serviceName.equals(service.service.getClassName())&&processName.equals(service.process))
  5. returntrue;
  6. }
  7. returnfalse;
  8. }

判断指定进程是否正在运行:

[java] view plain copy
  1. publicstaticbooleanisProcessRunning(Contextctx,Stringname){
  2. ActivityManageram=(ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
  3. List<RunningAppProcessInfo>apps=am.getRunningAppProcesses();
  4. for(RunningAppProcessInfoapp:apps){
  5. if(app.processName.equals(name)){
  6. returntrue;
  7. }
  8. }
  9. returnfalse;
  10. }

汉字转拼音:
百度搜素pinyin4j.jar 获取官网下载。添加至lib中

[java] view plain copy
  1. /**
  2. *汉字转换为拼音
  3. *@authorAdministrator
  4. *
  5. */
  6. publicclassHanZiToPinYinUtil{
  7. publicstaticStringtoPinYin(Stringstr){
  8. Stringpy="";
  9. String[]t=newString[str.length()];
  10. char[]hanzi=newchar[str.length()];
  11. for(inti=0;i<str.length();i++){
  12. hanzi[i]=str.charAt(i);
  13. }
  14. net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormatt1=newHanyuPinyinOutputFormat();
  15. t1.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  16. t1.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  17. t1.setVCharType(HanyuPinyinVCharType.WITH_V);
  18. try{
  19. for(inti=0;i<str.length();i++){
  20. if((str.charAt(i)>='a'&&str.charAt(i)<'z')
  21. ||(str.charAt(i)>='A'&&str.charAt(i)<='Z')
  22. ||(str.charAt(i)>='0'&&str.charAt(i)<='9')){
  23. py+=str.charAt(i);
  24. }else{
  25. t=PinyinHelper.toHanyuPinyinStringArray(hanzi[i],t1);
  26. py=py+t[0];
  27. }
  28. }
  29. }catch(BadHanyuPinyinOutputFormatCombinatione){
  30. e.printStackTrace();
  31. }
  32. returnpy.trim().toString();
  33. }
  34. publicstaticvoidmain(Stringargs[]){
  35. System.out.println(HanZiToPinYinUtil.toPinYin("我屮艸芔茻"));
  36. }

开启飞行模式:

[java] view plain copy
  1. booleanisEnabled=Settings.System.getInt(
  2. paramContext.getContentResolver(),
  3. Settings.System.AIRPLANE_MODE_ON,0)==1;
  4. if(isEnabled==true)
  5. {
  6. Settings.System.putInt(
  7. paramContext.getContentResolver(),
  8. Settings.System.AIRPLANE_MODE_ON,isEnabled?0:1);
  9. //Postanintenttoreload
  10. Intentintent=newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
  11. intent.putExtra("state",!isEnabled);
  12. paramContext.sendBroadcast(intent);
  13. }
  14. else
  15. {
  16. Settings.System.putInt(
  17. paramContext.getContentResolver(),
  18. Settings.System.AIRPLANE_MODE_ON,isEnabled?0:1);
  19. //Postanintenttoreload
  20. Intentintent=newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
  21. intent.putExtra("state",!isEnabled);
  22. paramContext.sendBroadcast(intent);
  23. }
  24. <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>
  25. <uses-permissionandroid:name="android.permission.WRITE_SECURE_SETTINGS"/>


开机自启动:(注意:app一定要安装到内存中,在sd卡上无法自启动)

[java] view plain copy
  1. <receiverandroid:name="com.pioneersoft.aoc.ui.BootBroadcastReceiver"android:enabled="true"android:exported="true">
  2. <intent-filter>
  3. <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
  4. <categoryandroid:name="android.intent.category.HOME"/>
  5. </intent-filter>
  6. </receiver>

[java] view plain copy
  1. publicclassBootBroadcastReceiverextendsBroadcastReceiver{
  2. //staticfinalStringaction_boot="android.intent.action.BOOT_COMPLETED";
  3. @Override
  4. publicvoidonReceive(Contextcontext,Intentintent){
  5. //if(intent.getAction().equals(action_boot)){
  6. IntentbootStartIntent=newIntent(context,MainActivity.class);
  7. bootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  8. context.startActivity(bootStartIntent);
  9. //}
  10. }
  11. }

获取未安装apk信息:

[java] view plain copy
  1. /**获取未安装的APK信息
  2. *@paramcontext
  3. *@paramarchiveFilePathAPK文件的路径。如:/sdcard/download/XX.apk
  4. */
  5. publicvoidgetUninatllApkInfo(Contextcontext,StringarchiveFilePath){
  6. PackageManagerpm=context.getPackageManager();
  7. PackageInfoinfo=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);
  8. if(info!=null){
  9. ApplicationInfoappInfo=info.applicationInfo;
  10. StringappName=pm.getApplicationLabel(appInfo).toString();
  11. StringpackageName=appInfo.packageName;
  12. Drawableicon=pm.getApplicationIcon(appInfo);
  13. }
  14. }

监听apk安装,卸载,替换行为:

[java] view plain copy
  1. privatevoidregisterIntentReceivers(){
  2. IntentFilterfilter=newIntentFilter(Intent.ACTION_PACKAGE_ADDED);
  3. filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
  4. filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
  5. filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
  6. filter.addDataScheme("package");
  7. registerReceiver(mApplicationsReceiver,filter);
  8. }
  9. /**
  10. *Receivesnotificationswhenapplicationsareadded/removed.
  11. */
  12. privateclassApplicationsIntentReceiverextendsBroadcastReceiver{
  13. @Override
  14. publicvoidonReceive(Contextcontext,Intentintent){
  15. //PackageManagermanager=context.getPackageManager();
  16. if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)){
  17. StringpackageName=intent.getData().getSchemeSpecificPart();
  18. Toast.makeText(context,"安装成功"+packageName,Toast.LENGTH_LONG).show();
  19. }
  20. if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){
  21. StringpackageName=intent.getData().getSchemeSpecificPart();
  22. Toast.makeText(context,"卸载成功"+packageName,Toast.LENGTH_LONG).show();
  23. }
  24. if(intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)){
  25. StringpackageName=intent.getData().getSchemeSpecificPart();
  26. Toast.makeText(context,"替换成功"+packageName,Toast.LENGTH_LONG).show();
  27. }
  28. }
  29. }



loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,显示找不到网页还有部分html代码。需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f 。
可以使用以下两种代码,data为string类型的html代码
1 webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html", "utf-8");
这样一些背景效果什么的都不怎么好看了。不推荐。
2 webView.loadDataWithBaseURL(null,data, "text/html", "utf-8", null);

这样就会完美解析了。


计算网络接收byte[] 字节数组的实际接受内容大小:

[java] view plain copy
  1. publicstaticvoidmain(String[]args){
  2. byte[]bt=newbyte[1024];
  3. Stringmsg="helo!youareverynice!haveagoodtime!happyeveryday!";
  4. byte[]t=msg.getBytes();
  5. for(inti=0;i<t.length;i++){
  6. bt[i]=t[i];
  7. }
  8. Stringmessage=newString(bt).trim();
  9. System.out.println("msg="+message+"len="+message.length());
  10. }

获取现在正调用的方法名

[java] view plain copy
  1. StringmethodName=
  2. Thread.currentThread().getStackTrace()[1].getMethodName();
  3. StringmethodName=Thread.currentThread().getStackTrace()[1].getMethodName();


[java] view plain copy
  1. /**
  2. *安装app
  3. */
  4. publicstaticvoidopenAPK(Filef,Contextcontext){
  5. context.startActivity(getInstallApp(f,context));
  6. }
  7. publicstaticIntentgetInstallApp(Filef,Contextcontext){
  8. Intentintent=newIntent();
  9. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  10. //设置应用的安装来源,例如谷歌市场
  11. intent.putExtra("android.intent.extra.INSTALLER_PACKAGE_NAME",context.getPackageName());
  12. intent.setAction(android.content.Intent.ACTION_VIEW);
  13. /*设置intent的file*/
  14. intent.setDataAndType(Uri.fromFile(f),"application/vnd.android.package-archive");
  15. returnintent;
  16. }
  17. /**
  18. *卸载APP
  19. *@paramcontext
  20. *@parampackageName
  21. */
  22. publicstaticvoiduninstallApp(Contextcontext,StringpackageName){
  23. UripackageURI=Uri.parse("package:"+packageName);
  24. IntentuninstallIntent=newIntent(Intent.ACTION_DELETE,packageURI);
  25. uninstallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  26. context.startActivity(uninstallIntent);
  27. }


[java] view plain copy
  1. Android屏幕解锁和锁定
  2. //屏幕解锁
  3. KeyguardManagerkeyguardManager=(KeyguardManager)getSystemService(KEYGUARD_SERVICE);
  4. KeyguardLockkeyguardLock=keyguardManager.newKeyguardLock(LOCK_TAG);
  5. keyguardLock.disableKeyguard();
  6. //屏幕锁定
  7. keyguardLock.reenableKeyguard();
  8. Android屏幕常亮/点亮
  9. //保持屏幕常亮
  10. PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
  11. mWakeLock=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,LOCK_TAG);
  12. mWakeLock.acquire();
  13. //释放屏幕常亮锁
  14. if(null!=mWakeLock){
  15. mWakeLock.release();
  16. }
  17. /**
  18. *判断桌面是否已添加快捷方式
  19. *
  20. *@paramcx
  21. *@paramtitleName
  22. *快捷方式名称
  23. *@return
  24. */
  25. publicstaticbooleanhasShortcut(Contextcx){
  26. booleanresult=false;
  27. //获取当前应用名称
  28. Stringtitle=null;
  29. try{
  30. finalPackageManagerpm=cx.getPackageManager();
  31. title=pm.getApplicationLabel(
  32. pm.getApplicationInfo(cx.getPackageName(),
  33. PackageManager.GET_META_DATA)).toString();
  34. }catch(Exceptione){
  35. }
  36. finalStringuriStr;
  37. if(android.os.Build.VERSION.SDK_INT<8){
  38. uriStr="content://com.android.launcher.settings/favorites?notify=true";
  39. }else{
  40. uriStr="content://com.android.launcher2.settings/favorites?notify=true";
  41. }
  42. finalUriCONTENT_URI=Uri.parse(uriStr);
  43. finalCursorc=cx.getContentResolver().query(CONTENT_URI,null,
  44. "title=?",newString[]{title},null);
  45. if(c!=null&&c.getCount()>0){
  46. result=true;
  47. }
  48. returnresult;
  49. }
  50. /***
  51. *为当前应用添加桌面快捷方式
  52. *
  53. *@paramcx
  54. *@paramappName
  55. *快捷方式名称
  56. */
  57. publicstaticvoidaddShortcut(Contextcx){
  58. Intentshortcut=newIntent("com.android.launcher.action.INSTALL_SHORTCUT");
  59. IntentshortcutIntent=cx.getPackageManager()
  60. .getLaunchIntentForPackage(cx.getPackageName());
  61. shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
  62. //获取当前应用名称
  63. Stringtitle=null;
  64. try{
  65. finalPackageManagerpm=cx.getPackageManager();
  66. title=pm.getApplicationLabel(
  67. pm.getApplicationInfo(cx.getPackageName(),
  68. PackageManager.GET_META_DATA)).toString();
  69. }catch(Exceptione){
  70. }
  71. //快捷方式名称
  72. shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,title);
  73. //不允许重复创建(不一定有效)
  74. shortcut.putExtra("duplicate",false);
  75. //快捷方式的图标
  76. ParcelableiconResource=Intent.ShortcutIconResource.fromContext(cx,
  77. R.drawable.ic_launcher);
  78. shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,iconResource);
  79. cx.sendBroadcast(shortcut);
  80. }
  81. /***
  82. *删除当前应用的桌面快捷方式
  83. *
  84. *@paramcx
  85. */
  86. publicstaticvoiddelShortcut(Contextcx){
  87. Intentshortcut=newIntent(
  88. "com.android.launcher.action.UNINSTALL_SHORTCUT");
  89. //获取当前应用名称
  90. Stringtitle=null;
  91. try{
  92. finalPackageManagerpm=cx.getPackageManager();
  93. title=pm.getApplicationLabel(
  94. pm.getApplicationInfo(cx.getPackageName(),
  95. PackageManager.GET_META_DATA)).toString();
  96. }catch(Exceptione){
  97. }
  98. //快捷方式名称
  99. shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,title);
  100. IntentshortcutIntent=cx.getPackageManager()
  101. .getLaunchIntentForPackage(cx.getPackageName());
  102. shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
  103. cx.sendBroadcast(shortcut);
  104. }
  105. 相关权限配置
  106. <uses-permissionandroid:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
  107. <uses-permissionandroid:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
  108. <uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>


每个月的第几号执行提醒功能:

[java] view plain copy
  1. Calendarcal=Calendar.getInstance();
  2. cal.set(Calendar.DAY_OF_MONTH,4);
  3. cal.set(Calendar.HOUR_OF_DAY,10);
  4. cal.set(Calendar.MINUTE,0);
  5. cal.set(Calendar.SECOND,0);
  6. Datenow=newDate(System.currentTimeMillis());
  7. if(cal.getTime().before(now)){
  8. cal.add(Calendar.MONTH,1);
  9. }
  10. longfirstTime=cal.getTime().getTime();
  11. alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,firstTime,1000*60
  12. *60*24*30,pendingIntent);


上传应用到服务器:

[java] view plain copy
  1. privateStringnewName="htys.mp3";
  2. //要上传的本地文件路径
  3. privateStringuploadFile="/data/data/com.xzq/htys.mp3";
  4. //上传到服务器的指定位置
  5. privateStringactionUrl="http://192.168.100.100:8080/upload/upload.jsp";

[java] view plain copy
  1. privatevoiduploadFile()
  2. {
  3. Stringend="/r/n";
  4. StringHyphens="--";
  5. Stringboundary="*****";
  6. try
  7. {
  8. URLurl=newURL(actionUrl);
  9. HttpURLConnectioncon=(HttpURLConnection)url.openConnection();
  10. con.setDoInput(true);
  11. con.setDoOutput(true);
  12. con.setUseCaches(false);
  13. con.setRequestMethod("POST");
  14. con.setRequestProperty("Connection","Keep-Alive");
  15. con.setRequestProperty("Charset","UTF-8");
  16. con.setRequestProperty("Content-Type",
  17. "multipart/form-data;boundary="+boundary);
  18. DataOutputStreamds=newDataOutputStream(con.getOutputStream());
  19. ds.writeBytes(Hyphens+boundary+end);
  20. ds.writeBytes("Content-Disposition:form-data;"
  21. +"name=/"file1/";filename=/""+newName+"/""+end);
  22. ds.writeBytes(end);
  23. FileInputStreamfStream=newFileInputStream(uploadFile);
  24. intbufferSize=1024;
  25. byte[]buffer=newbyte[bufferSize];
  26. intlength=-1;
  27. while((length=fStream.read(buffer))!=-1)
  28. {
  29. ds.write(buffer,0,length);
  30. }
  31. ds.writeBytes(end);
  32. ds.writeBytes(Hyphens+boundary+Hyphens+end);
  33. fStream.close();
  34. ds.flush();
  35. InputStreamis=con.getInputStream();
  36. intch;
  37. StringBufferb=newStringBuffer();
  38. while((ch=is.read())!=-1)
  39. {
  40. b.append((char)ch);
  41. }
  42. System.out.println("上传成功");
  43. Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_LONG)
  44. .show();
  45. ds.close();
  46. }catch(Exceptione)
  47. {
  48. System.out.println("上传失败"+e.getMessage());
  49. Toast.makeText(MainActivity.this,"上传失败"+e.getMessage(),
  50. Toast.LENGTH_LONG).show();
  51. }
  52. }
  53. }

创建两个对话框模式进度样式:

ProgressDialog pdialog = new ProgressDialog(SettingActivity.this,0);


ScrollView 嵌套 ListView GridView问题

[java] view plain copy
  1. publicclassMyListViewextendsListView{
  2. publicMyListView(Contextcontext,AttributeSetattrs){
  3. super(context,attrs);
  4. }
  5. publicMyListView(Contextcontext){
  6. super(context);
  7. }
  8. publicMyListView(Contextcontext,AttributeSetattrs,intdefStyle){
  9. super(context,attrs,defStyle);
  10. }
  11. @Override
  12. publicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
  13. intexpandSpec=MeasureSpec.makeMeasureSpec(
  14. Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
  15. super.onMeasure(widthMeasureSpec,expandSpec);
  16. }
  17. }


设置texview 垂直滚动条

<TextView      android:focusable="true"      android:focusableInTouchMode="true"      android:ellipsize="marquee"      android:marqueeRepeatLimit="marquee_forever"      android:scrollbars="vertical"              android:singleLine="false" />

设置textview 文字水平自动滚动(跑马灯效果)

<com.example.playpic.MyTextView        android:id="@+id/myTv"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:textColor="#000000"        android:focusable="true"        android:focusableInTouchMode="true"        android:scrollHorizontally="true"        android:ellipsize="marquee"        android:marqueeRepeatLimit="marquee_forever"        android:singleLine="true"        />

布局文件需添加属性:android:addStatesFromChildren="true"
修改的textview

[java] view plain copy
  1. publicclassMyTextViewextendsTextView{
  2. publicMyTextView(Contextcontext){
  3. super(context);
  4. }
  5. publicMyTextView(Contextcontext,AttributeSetattrs){
  6. super(context,attrs);
  7. }
  8. publicMyTextView(Contextcontext,AttributeSetattrs,intdefStyle){
  9. super(context,attrs,defStyle);
  10. }
  11. @Override
  12. protectedvoidonDraw(Canvascanvas){
  13. super.onDraw(canvas);
  14. }
  15. @Override
  16. publicbooleanisFocused(){
  17. returntrue;
  18. }
  19. }
  20. setContentView(R.layout.scrollview1);
  21. MyTextViewtv=(MyTextView)findViewById(R.id.myTv);
  22. tv.setText(str);
  23. tv.setMovementMethod(ScrollingMovementMethod.getInstance());

大数据量提高sqlite数据存储效率:
在开发过程中解析xml中的数据有上万条之多,发现在想sqlite中插入的时候非常耗时,原因是没有使用事务,默认是每插入一次使用
一次事务,这样如果插入1w条数据,就要开启1w次事务,非常耗时,所以我们可以通过手动开启和关闭的方式控制事务。

[java] view plain copy
  1. publicvoidinsertAll(StringdatabaseName,
  2. ArrayList<ContentValues>valuesArr){
  3. SQLiteDatabasedb=getWritableDatabase();
  4. db.beginTransaction();
  5. for(ContentValuesval:valuesArr){
  6. db.insert(databaseName,null,val);
  7. }
  8. db.setTransactionSuccessful();
  9. db.endTransaction();
  10. db.close();
  11. }

计算日期之间相隔几天:

[java] view plain copy
  1. publicvoidt(){
  2. Stringbefore="2013-5-15";
  3. Stringnow="2013-5-17";
  4. SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
  5. try{
  6. Dated1=sdf.parse(before);
  7. Dated2=sdf.parse(now);
  8. longdaysBetween=(d2.getTime()-d1.getTime()+1000000)
  9. /(3600*24*1000);
  10. System.out.println("相隔:"+daysBetween+"天");
  11. }catch(Exceptione){
  12. System.out.println(e.getMessage());
  13. }
  14. }

更多相关文章

  1. Android改变button背景色与获取button背景色
  2. sdk manage 更新与安装
  3. aapt: Android(安卓)Asset Packaging Tool
  4. Python+appium 实现 Android(安卓)自动化
  5. Android(安卓)获取屏幕的分辨率
  6. 调用Android(安卓)installer 安装和卸载程序
  7. android常用方法总结
  8. android:软件的安装和卸载源代码
  9. Pycharm安装PyQt5的详细教程

随机推荐

  1. 在android工程中导入jar包或lib
  2. android网卡调试命令
  3. Android(安卓)MTK 8.1 预制应用 (讯飞输入
  4. Android(安卓)的 ApkTool 反编译 apk xml
  5. 【安卓学习之常见问题】 编译V7问题- 'an
  6. 在Ubuntu下使用adb
  7. Android实现中文按拼音排序方法
  8. Android(安卓)自定义码表图
  9. Google Maps API v2密钥申请
  10. android 系统重启关机 方法 非常好的一篇