android 学习笔记
16lz
2022-03-29
原文地址: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
- publicstaticbooleanisServiceRunning(Contextctx,StringserviceName,StringprocessName){
- ActivityManagermanager=(ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
- for(RunningServiceInfoservice:manager.getRunningServices(Integer.MAX_VALUE)){
- if(serviceName.equals(service.service.getClassName())&&processName.equals(service.process))
- returntrue;
- }
- returnfalse;
- }
判断指定进程是否正在运行:
[java] view plain copy
- publicstaticbooleanisProcessRunning(Contextctx,Stringname){
- ActivityManageram=(ActivityManager)ctx.getSystemService(Context.ACTIVITY_SERVICE);
- List<RunningAppProcessInfo>apps=am.getRunningAppProcesses();
- for(RunningAppProcessInfoapp:apps){
- if(app.processName.equals(name)){
- returntrue;
- }
- }
- returnfalse;
- }
汉字转拼音:
百度搜素pinyin4j.jar 获取官网下载。添加至lib中
[java] view plain copy
- /**
- *汉字转换为拼音
- *@authorAdministrator
- *
- */
- publicclassHanZiToPinYinUtil{
- publicstaticStringtoPinYin(Stringstr){
- Stringpy="";
- String[]t=newString[str.length()];
- char[]hanzi=newchar[str.length()];
- for(inti=0;i<str.length();i++){
- hanzi[i]=str.charAt(i);
- }
- net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormatt1=newHanyuPinyinOutputFormat();
- t1.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- t1.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
- t1.setVCharType(HanyuPinyinVCharType.WITH_V);
- try{
- for(inti=0;i<str.length();i++){
- if((str.charAt(i)>='a'&&str.charAt(i)<'z')
- ||(str.charAt(i)>='A'&&str.charAt(i)<='Z')
- ||(str.charAt(i)>='0'&&str.charAt(i)<='9')){
- py+=str.charAt(i);
- }else{
- t=PinyinHelper.toHanyuPinyinStringArray(hanzi[i],t1);
- py=py+t[0];
- }
- }
- }catch(BadHanyuPinyinOutputFormatCombinatione){
- e.printStackTrace();
- }
- returnpy.trim().toString();
- }
- publicstaticvoidmain(Stringargs[]){
- System.out.println(HanZiToPinYinUtil.toPinYin("我屮艸芔茻"));
- }
开启飞行模式:
[java] view plain copy
- booleanisEnabled=Settings.System.getInt(
- paramContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,0)==1;
- if(isEnabled==true)
- {
- Settings.System.putInt(
- paramContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,isEnabled?0:1);
- //Postanintenttoreload
- Intentintent=newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.putExtra("state",!isEnabled);
- paramContext.sendBroadcast(intent);
- }
- else
- {
- Settings.System.putInt(
- paramContext.getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON,isEnabled?0:1);
- //Postanintenttoreload
- Intentintent=newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.putExtra("state",!isEnabled);
- paramContext.sendBroadcast(intent);
- }
- <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>
- <uses-permissionandroid:name="android.permission.WRITE_SECURE_SETTINGS"/>
开机自启动:(注意:app一定要安装到内存中,在sd卡上无法自启动)
[java] view plain copy
- <receiverandroid:name="com.pioneersoft.aoc.ui.BootBroadcastReceiver"android:enabled="true"android:exported="true">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <categoryandroid:name="android.intent.category.HOME"/>
- </intent-filter>
- </receiver>
[java] view plain copy
- publicclassBootBroadcastReceiverextendsBroadcastReceiver{
- //staticfinalStringaction_boot="android.intent.action.BOOT_COMPLETED";
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //if(intent.getAction().equals(action_boot)){
- IntentbootStartIntent=newIntent(context,MainActivity.class);
- bootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(bootStartIntent);
- //}
- }
- }
获取未安装apk信息:
[java] view plain copy
- /**获取未安装的APK信息
- *@paramcontext
- *@paramarchiveFilePathAPK文件的路径。如:/sdcard/download/XX.apk
- */
- publicvoidgetUninatllApkInfo(Contextcontext,StringarchiveFilePath){
- PackageManagerpm=context.getPackageManager();
- PackageInfoinfo=pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);
- if(info!=null){
- ApplicationInfoappInfo=info.applicationInfo;
- StringappName=pm.getApplicationLabel(appInfo).toString();
- StringpackageName=appInfo.packageName;
- Drawableicon=pm.getApplicationIcon(appInfo);
- }
- }
监听apk安装,卸载,替换行为:
[java] view plain copy
- privatevoidregisterIntentReceivers(){
- IntentFilterfilter=newIntentFilter(Intent.ACTION_PACKAGE_ADDED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addDataScheme("package");
- registerReceiver(mApplicationsReceiver,filter);
- }
- /**
- *Receivesnotificationswhenapplicationsareadded/removed.
- */
- privateclassApplicationsIntentReceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //PackageManagermanager=context.getPackageManager();
- if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)){
- StringpackageName=intent.getData().getSchemeSpecificPart();
- Toast.makeText(context,"安装成功"+packageName,Toast.LENGTH_LONG).show();
- }
- if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){
- StringpackageName=intent.getData().getSchemeSpecificPart();
- Toast.makeText(context,"卸载成功"+packageName,Toast.LENGTH_LONG).show();
- }
- if(intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)){
- StringpackageName=intent.getData().getSchemeSpecificPart();
- Toast.makeText(context,"替换成功"+packageName,Toast.LENGTH_LONG).show();
- }
- }
- }
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
- publicstaticvoidmain(String[]args){
- byte[]bt=newbyte[1024];
- Stringmsg="helo!youareverynice!haveagoodtime!happyeveryday!";
- byte[]t=msg.getBytes();
- for(inti=0;i<t.length;i++){
- bt[i]=t[i];
- }
- Stringmessage=newString(bt).trim();
- System.out.println("msg="+message+"len="+message.length());
- }
获取现在正调用的方法名
[java] view plain copy
- StringmethodName=
- Thread.currentThread().getStackTrace()[1].getMethodName();
- StringmethodName=Thread.currentThread().getStackTrace()[1].getMethodName();
[java] view plain copy
- /**
- *安装app
- */
- publicstaticvoidopenAPK(Filef,Contextcontext){
- context.startActivity(getInstallApp(f,context));
- }
- publicstaticIntentgetInstallApp(Filef,Contextcontext){
- Intentintent=newIntent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- //设置应用的安装来源,例如谷歌市场
- intent.putExtra("android.intent.extra.INSTALLER_PACKAGE_NAME",context.getPackageName());
- intent.setAction(android.content.Intent.ACTION_VIEW);
- /*设置intent的file*/
- intent.setDataAndType(Uri.fromFile(f),"application/vnd.android.package-archive");
- returnintent;
- }
- /**
- *卸载APP
- *@paramcontext
- *@parampackageName
- */
- publicstaticvoiduninstallApp(Contextcontext,StringpackageName){
- UripackageURI=Uri.parse("package:"+packageName);
- IntentuninstallIntent=newIntent(Intent.ACTION_DELETE,packageURI);
- uninstallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(uninstallIntent);
- }
[java] view plain copy
- Android屏幕解锁和锁定
- //屏幕解锁
- KeyguardManagerkeyguardManager=(KeyguardManager)getSystemService(KEYGUARD_SERVICE);
- KeyguardLockkeyguardLock=keyguardManager.newKeyguardLock(LOCK_TAG);
- keyguardLock.disableKeyguard();
- //屏幕锁定
- keyguardLock.reenableKeyguard();
- Android屏幕常亮/点亮
- //保持屏幕常亮
- PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
- mWakeLock=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,LOCK_TAG);
- mWakeLock.acquire();
- //释放屏幕常亮锁
- if(null!=mWakeLock){
- mWakeLock.release();
- }
- /**
- *判断桌面是否已添加快捷方式
- *
- *@paramcx
- *@paramtitleName
- *快捷方式名称
- *@return
- */
- publicstaticbooleanhasShortcut(Contextcx){
- booleanresult=false;
- //获取当前应用名称
- Stringtitle=null;
- try{
- finalPackageManagerpm=cx.getPackageManager();
- title=pm.getApplicationLabel(
- pm.getApplicationInfo(cx.getPackageName(),
- PackageManager.GET_META_DATA)).toString();
- }catch(Exceptione){
- }
- finalStringuriStr;
- if(android.os.Build.VERSION.SDK_INT<8){
- uriStr="content://com.android.launcher.settings/favorites?notify=true";
- }else{
- uriStr="content://com.android.launcher2.settings/favorites?notify=true";
- }
- finalUriCONTENT_URI=Uri.parse(uriStr);
- finalCursorc=cx.getContentResolver().query(CONTENT_URI,null,
- "title=?",newString[]{title},null);
- if(c!=null&&c.getCount()>0){
- result=true;
- }
- returnresult;
- }
- /***
- *为当前应用添加桌面快捷方式
- *
- *@paramcx
- *@paramappName
- *快捷方式名称
- */
- publicstaticvoidaddShortcut(Contextcx){
- Intentshortcut=newIntent("com.android.launcher.action.INSTALL_SHORTCUT");
- IntentshortcutIntent=cx.getPackageManager()
- .getLaunchIntentForPackage(cx.getPackageName());
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
- //获取当前应用名称
- Stringtitle=null;
- try{
- finalPackageManagerpm=cx.getPackageManager();
- title=pm.getApplicationLabel(
- pm.getApplicationInfo(cx.getPackageName(),
- PackageManager.GET_META_DATA)).toString();
- }catch(Exceptione){
- }
- //快捷方式名称
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,title);
- //不允许重复创建(不一定有效)
- shortcut.putExtra("duplicate",false);
- //快捷方式的图标
- ParcelableiconResource=Intent.ShortcutIconResource.fromContext(cx,
- R.drawable.ic_launcher);
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,iconResource);
- cx.sendBroadcast(shortcut);
- }
- /***
- *删除当前应用的桌面快捷方式
- *
- *@paramcx
- */
- publicstaticvoiddelShortcut(Contextcx){
- Intentshortcut=newIntent(
- "com.android.launcher.action.UNINSTALL_SHORTCUT");
- //获取当前应用名称
- Stringtitle=null;
- try{
- finalPackageManagerpm=cx.getPackageManager();
- title=pm.getApplicationLabel(
- pm.getApplicationInfo(cx.getPackageName(),
- PackageManager.GET_META_DATA)).toString();
- }catch(Exceptione){
- }
- //快捷方式名称
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,title);
- IntentshortcutIntent=cx.getPackageManager()
- .getLaunchIntentForPackage(cx.getPackageName());
- shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,shortcutIntent);
- cx.sendBroadcast(shortcut);
- }
- 相关权限配置
- <uses-permissionandroid:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- <uses-permissionandroid:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
- <uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>
每个月的第几号执行提醒功能:
[java] view plain copy- Calendarcal=Calendar.getInstance();
- cal.set(Calendar.DAY_OF_MONTH,4);
- cal.set(Calendar.HOUR_OF_DAY,10);
- cal.set(Calendar.MINUTE,0);
- cal.set(Calendar.SECOND,0);
- Datenow=newDate(System.currentTimeMillis());
- if(cal.getTime().before(now)){
- cal.add(Calendar.MONTH,1);
- }
- longfirstTime=cal.getTime().getTime();
- alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,firstTime,1000*60
- *60*24*30,pendingIntent);
上传应用到服务器:
[java] view plain copy
- privateStringnewName="htys.mp3";
- //要上传的本地文件路径
- privateStringuploadFile="/data/data/com.xzq/htys.mp3";
- //上传到服务器的指定位置
- privateStringactionUrl="http://192.168.100.100:8080/upload/upload.jsp";
[java] view plain copy
- privatevoiduploadFile()
- {
- Stringend="/r/n";
- StringHyphens="--";
- Stringboundary="*****";
- try
- {
- URLurl=newURL(actionUrl);
- HttpURLConnectioncon=(HttpURLConnection)url.openConnection();
- con.setDoInput(true);
- con.setDoOutput(true);
- con.setUseCaches(false);
- con.setRequestMethod("POST");
- con.setRequestProperty("Connection","Keep-Alive");
- con.setRequestProperty("Charset","UTF-8");
- con.setRequestProperty("Content-Type",
- "multipart/form-data;boundary="+boundary);
- DataOutputStreamds=newDataOutputStream(con.getOutputStream());
- ds.writeBytes(Hyphens+boundary+end);
- ds.writeBytes("Content-Disposition:form-data;"
- +"name=/"file1/";filename=/""+newName+"/""+end);
- ds.writeBytes(end);
- FileInputStreamfStream=newFileInputStream(uploadFile);
- intbufferSize=1024;
- byte[]buffer=newbyte[bufferSize];
- intlength=-1;
- while((length=fStream.read(buffer))!=-1)
- {
- ds.write(buffer,0,length);
- }
- ds.writeBytes(end);
- ds.writeBytes(Hyphens+boundary+Hyphens+end);
- fStream.close();
- ds.flush();
- InputStreamis=con.getInputStream();
- intch;
- StringBufferb=newStringBuffer();
- while((ch=is.read())!=-1)
- {
- b.append((char)ch);
- }
- System.out.println("上传成功");
- Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_LONG)
- .show();
- ds.close();
- }catch(Exceptione)
- {
- System.out.println("上传失败"+e.getMessage());
- Toast.makeText(MainActivity.this,"上传失败"+e.getMessage(),
- Toast.LENGTH_LONG).show();
- }
- }
- }
创建两个对话框模式进度样式:
ProgressDialog pdialog = new ProgressDialog(SettingActivity.this,0);
ScrollView 嵌套 ListView GridView问题
[java] view plain copy
- publicclassMyListViewextendsListView{
- publicMyListView(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- }
- publicMyListView(Contextcontext){
- super(context);
- }
- publicMyListView(Contextcontext,AttributeSetattrs,intdefStyle){
- super(context,attrs,defStyle);
- }
- @Override
- publicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
- intexpandSpec=MeasureSpec.makeMeasureSpec(
- Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec,expandSpec);
- }
- }
设置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
- publicclassMyTextViewextendsTextView{
- publicMyTextView(Contextcontext){
- super(context);
- }
- publicMyTextView(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- }
- publicMyTextView(Contextcontext,AttributeSetattrs,intdefStyle){
- super(context,attrs,defStyle);
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- super.onDraw(canvas);
- }
- @Override
- publicbooleanisFocused(){
- returntrue;
- }
- }
- setContentView(R.layout.scrollview1);
- MyTextViewtv=(MyTextView)findViewById(R.id.myTv);
- tv.setText(str);
- tv.setMovementMethod(ScrollingMovementMethod.getInstance());
大数据量提高sqlite数据存储效率:
在开发过程中解析xml中的数据有上万条之多,发现在想sqlite中插入的时候非常耗时,原因是没有使用事务,默认是每插入一次使用
一次事务,这样如果插入1w条数据,就要开启1w次事务,非常耗时,所以我们可以通过手动开启和关闭的方式控制事务。
[java] view plain copy
- publicvoidinsertAll(StringdatabaseName,
- ArrayList<ContentValues>valuesArr){
- SQLiteDatabasedb=getWritableDatabase();
- db.beginTransaction();
- for(ContentValuesval:valuesArr){
- db.insert(databaseName,null,val);
- }
- db.setTransactionSuccessful();
- db.endTransaction();
- db.close();
- }
计算日期之间相隔几天:
[java] view plain copy
- publicvoidt(){
- Stringbefore="2013-5-15";
- Stringnow="2013-5-17";
- SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");
- try{
- Dated1=sdf.parse(before);
- Dated2=sdf.parse(now);
- longdaysBetween=(d2.getTime()-d1.getTime()+1000000)
- /(3600*24*1000);
- System.out.println("相隔:"+daysBetween+"天");
- }catch(Exceptione){
- System.out.println(e.getMessage());
- }
- }
更多相关文章
- Android改变button背景色与获取button背景色
- sdk manage 更新与安装
- aapt: Android(安卓)Asset Packaging Tool
- Python+appium 实现 Android(安卓)自动化
- Android(安卓)获取屏幕的分辨率
- 调用Android(安卓)installer 安装和卸载程序
- android常用方法总结
- android:软件的安装和卸载源代码
- Pycharm安装PyQt5的详细教程