Android开发代码片段

1、获取电源锁

public static void acquireWakeLock() {
    unlockKeyBoard();
    try {
        if (null == mWakeLock) {
            PowerManager pm = (PowerManager) BaseApplication.getInstance()
                    .getSystemService(Context.POWER_SERVICE);
            try {
                mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                        | PowerManager.ACQUIRE_CAUSES_WAKEUP
                        | PowerManager.ON_AFTER_RELEASE, "PushMessageReceiver"); // |
                                                                                    // PowerManager.ON_AFTER_RELEASE
            } catch (Exception e) {
                DbUtils.exceptionHandler(e);
            }
        }
        if (null != mWakeLock) {
            mWakeLock.acquire();
        }
    } catch (Exception e) {
        DbUtils.exceptionHandler(e);
    }
}

2、释放设备电源锁

public static void releaseWakeLock() {
    try {
        if (null != mWakeLock) {
            mWakeLock.release();
            mWakeLock = null;
        }
    } catch (Exception e) {
        DbUtils.exceptionHandler(e);
    }
}

3、解锁键盘

public static void unlockKeyBoard () {
    KeyguardManager km = (KeyguardManager)ApplicationContext.getInstance().getContext().getSystemService(Context.KEYGUARD_SERVICE);
    km.newKeyguardLock("Tag For Debug").disableKeyguard();
}

4、获取当前程序版本名

/**  
* 返回当前程序版本名  
*/    
public static String getAppVersionName(Context context) {    
    String versionName = "";    
    try {    
        // ---get the package info---    
        PackageManager pm = context.getPackageManager();    

        PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);    
        versionName = pi.versionName;    //版本名称
        versioncode = pi.versionCode;  //版本号
        if (versionName == null || versionName.length() <= 0) {    
            return "";    
        }    
    } catch (Exception e) {    
        Log.e("VersionInfo", "Exception", e);    
    }    
    return versionName;    
} 

5、获取当前应用的版本号

public static String getVersionName() throws Exception  
{  
        // 获取packagemanager的实例  
        PackageManager packageManager = getPackageManager();  
        // getPackageName()是你当前类的包名,0代表是获取版本信息  
        PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),0);  
        String version = packInfo.versionName;  
        return version;  
}

6、获取当前系统的版本号

   /** 
    * 手机系统版本 
    */  
    public static String getSdkVersion() {  
        return android.os.Build.VERSION.RELEASE;  
    }  
    

7、当我们点击某个话题的选项卡,会弹出一个popupwindow,里面有诸如 评论、回复的选项,你点击这个选项的时候,需要定位到EditText编辑框,并且自动弹出输入法。可以考虑如下方法:

// 获取编辑框焦点
editText.setFocusable(true);
//打开软键盘
InputMethodManager imm = (InputMethodManager) ctx
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

//关闭软键盘
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

8、EditText软键盘

    //打开软键盘
    et_feedback_content.setFocusable(true);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    //关闭软键盘
    ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(input.getWindowToken(), 0); 
    

9、设置全屏的Dialog

//在代码里设置Dialog的Theme
Dialog dialog = new Dialog(this, R.style.Dialog_Fullscreen);  
dialog.setContentView(R.layout.main);  
dialog.show(); 

//设置style
 <style name="Dialog_Fullscreen"> 
   <item name="android:windowFullscreen">true</item> 
   <item name="android:windowNoTitle">true</item>  
</style>   

10、设置全屏的Dialog(二)

我们也可以自定义Dialog,首先继承Dialig,然后再构造函数中添加

super(context, android.R.style.Theme); 
setOwnerActivity((Activity)context);  

11、设置全屏Dialog(三)

首先介绍一个方法:getDecorView()

decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。 于是,我们就可以算出状态栏的高度了。

Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;

同样我们获取标题栏的高度

getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了,代码如下:
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();         
int titleBarHeight = contentTop - statusBarHeight; //statusBarHeight是上面所求的状态栏的高度

最后:知道上述原理,我们就可以设置我们的Dialog和activity一样大了,Java代码如下:

final Dialog dialog = new Dialog(WenDetailActivity.this, R.style.popupDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.wen_cover_pager);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        WindowManager.LayoutParams lay = dialog.getWindow().getAttributes();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        Rect rect = new Rect();
        View view = getWindow().getDecorView();//decorView是window中的最顶层view,可以从window中获取到decorView
        view.getWindowVisibleDisplayFrame(rect);
        lay.height = dm.heightPixels - rect.top;
        lay.width = dm.widthPixels;
        

style.xml如下:

<style name="popupDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@drawable/filled_activity_bg</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <!--<item name="android:windowAnimationStyle">@style/dialog_animation</item>-->
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:backgroundDimAmount">0.6</item><!-- 灰度 -->
        <!--<item name="android:windowFullscreen">true</item>-->
 </style>
 

12、利用代码清除App的数据

/** 
* 利用代码清除App的数据 
* 平常我们在清除App的数据时,多半在设置中找到对应的App 
* 然后选择其清除数据.下面给出代码实现. 
*  
* 注意事项: 
* 1 设备需要root 
* 2 该示例中删除的是系统级应用 
* 2 注意在命令的末尾需要加上换行\n 
*   这就相当于我们平时在Dos中输入命令后再换行一样. 
*   否则命令不会被执行. 
*/  
private void cleanData(String packageName){  
    try {  
        Process su= Runtime.getRuntime().exec("su");  
        String cmd = "cd /data/data/"+packageName+";"+"rm -r `ls|grep -v lib`";  
        System.out.println("------cmd="+cmd);  
        cmd = cmd + "\n exit\n";  
        su.getOutputStream().write(cmd.getBytes());  
        if ((su.waitFor() != 0)) {  
            throw new SecurityException();  
        }  
    } catch (Exception e) {  
        System.out.println("---> 9527 清除数据时 e="+e.toString());  
    }  
      
} 

13、清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录

/** 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录  */
import java.io.File;
import android.content.Context;
import android.os.Environment;

/** * 本应用数据清除管理器 */
public class DataCleanManager {
/** * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * * @param context */
public static void cleanInternalCache(Context context) {
    deleteFilesByDirectory(context.getCacheDir());
}

/** * 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) * * @param context */
public static void cleanDatabases(Context context) {
    deleteFilesByDirectory(new File("/data/data/"
            + context.getPackageName() + "/databases"));
}

/**
 * * 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) * * @param
 * context
 */
public static void cleanSharedPreference(Context context) {
    deleteFilesByDirectory(new File("/data/data/"
            + context.getPackageName() + "/shared_prefs"));
}

/** * 按名字清除本应用数据库 * * @param context * @param dbName */
public static void cleanDatabaseByName(Context context, String dbName) {
    context.deleteDatabase(dbName);
}

/** * 清除/data/data/com.xxx.xxx/files下的内容 * * @param context */
public static void cleanFiles(Context context) {
    deleteFilesByDirectory(context.getFilesDir());
}

/**
 * * 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache) * * @param
 * context
 */
public static void cleanExternalCache(Context context) {
    if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        deleteFilesByDirectory(context.getExternalCacheDir());
    }
}

/** * 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除 * * @param filePath */
public static void cleanCustomCache(String filePath) {
    deleteFilesByDirectory(new File(filePath));
}

/** * 清除本应用所有的数据 * * @param context * @param filepath */
public static void cleanApplicationData(Context context, String... filepath) {
    cleanInternalCache(context);
    cleanExternalCache(context);
    cleanDatabases(context);
    cleanSharedPreference(context);
    cleanFiles(context);
    for (String filePath : filepath) {
        cleanCustomCache(filePath);
    }
}

/** * 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理 * * @param directory */
private static void deleteFilesByDirectory(File directory) {
    if (directory != null && directory.exists() && directory.isDirectory()) {
        for (File item : directory.listFiles()) {
            item.delete();
        }
    }
}
}

14、Listview测量高度 (放在设置完适配器之后进行测量,放在之前,没有效果)

   /**
    * 设置高度
    */
    private void setHeight(ListView listView) {
        // 获取listView的适配器
        ListAdapter adapter = listView.getAdapter();
        // 获取视图的个数
        int count = adapter.getCount();
        // 总高度
        int totalHeight = 0;
        // 循环获取视图
        for (int i = 0; i < count; i++) {
            // 通过i获取每个视图
            View view = adapter.getView(i, null, listView);
            // 重新测量view的高度
            view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
            // 获取测量后的高度添加到总高度
            totalHeight += view.getMeasuredHeight();
        }
        // 总高度加上所有分割线的总高度
        totalHeight += listView.getDividerHeight() * (count - 1);
        // 获取listView的布局属性
        LayoutParams params = listView.getLayoutParams();
        // 设置高度
        params.height = totalHeight;
        // 重新设置布局属性
        listView.setLayoutParams(params);
    }