Android小技巧总结1

0、Android彻底退出引用程序的方法

1) Dalvik VM的本地方法

    android.os.Process.killProcess(android.os.Process.myPid()); // 获取PID
    System.exit(0); // 常规java的标准退出法,返回值为0代表正常退出 

2)任务管理器方法

   首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限

   // 获取ActivityManager实例
    ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
    am.restartPackage(getPackageName());
  系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上权限声明:

  <!-- 权限声明 -->
  <uses-permission android:name="android.permission.RESTART_PACKAGES"></uses-permission>

3) 根据Activity的声明周期 

    我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志     Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

    在A窗口中使用下面的代码调用B窗口

    Intent intent = new Intent();
    intent.setClass(Android123.this, CWJ.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置
    startActivity(intent);

    接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

4)使用SingleTask模式

 将主Activity(记为MainActivity)设置为SingleTask模式,需要退出程序时,可以先跳转到MainActivity,然后调用finish函数退出程序。

5)将所有Activity注册一个接收finish消息的广播

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter();
    filter.addAction("finish");
    registerReceiver(mFinishReceiver, filter);
    ……
}
private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("finish".equals(intent.getAction())) {
            finish();
        }
    }
};

6)自定义一个Activity栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity,并添加提供了能够退出所有Activity的方法。代码如下:

public class ScreenManager {
    private static Stack<Activity> activityStack;
    private static ScreenManager instance;
    private ScreenManager() {
    }
    public static ScreenManager getScreenManager() {
        if (instance == null) {
            instance = new ScreenManager();
        }
        return instance;
    }
    // 退出栈顶Activity
    public void popActivity(Activity activity) {
        if (activity != null) {
            activity.finish();
            activityStack.remove(activity);
            activity = null;
        }
    }
 
    // 获得当前栈顶Activity
    public Activity currentActivity() {
        Activity activity = activityStack.lastElement();
        return activity;
    }
 
    // 将当前Activity推入栈中
    public void pushActivity(Activity activity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(activity);
    }
   
    // 退出栈中所有Activity
    public void popAllActivityExceptOne(Class cls) {
        while (true) {
            Activity activity = currentActivity();
            if (activity == null) {
                break;
            }
            if (activity.getClass().equals(cls)) {
                break;
            }
            popActivity(activity);
        }
    }
}

引申:按两次返回键退出程序:
    //监听返回键,点击两次退出
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            onBackCodePressed();
        }
        return false;
    }
   
    private int mPressedTime = 0;
    private void onBackCodePressed() {
        // 表示第一次点击
        if(mPressedTime == 0){
            Toast.makeText(this, "连续点击退出程序 ", Toast.LENGTH_SHORT).show();
            ++mPressedTime;
           
            new Thread(){
                @Override
                public void run() {
                    try {
                        sleep(2000);
                    } catch (Exception e) {
                        Log.e(TAG, e.toString());
                    } finally {
                        mPressedTime = 0;
                    }
                }
            };
        } else {
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }

1、绘制边框
<?xml version="1.0"encoding="utf-8"?>
<!-- 绘制边框 -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item android:right="0dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white"/>
        </shape>
    </item>
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/orchid"/>
        </shape>
    </item>
 
</layer-list>

2、在Android中判断字符串是否为null,或者字符串是否为空串,可以直接使用

    TextUtils.isEmpty(str);

TextUtils.isEmpty源码:

public static boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

3、判断横屏竖屏并进行切换:  
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
    setContentView(R.layout.横屏);
}
else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setContentView(R.layout.竖屏);
}

4、替代重复的findViewbyId书写:
   public <T> T $(int viewID) {
        return (T) findViewById(viewID);
    }

使用实例:
    TextView a;
    a = $(R.id.a_id);

5、获取系统当前时间并格式化
方法一:
        SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyy年MM月dd日   HH:mm:ss");
        Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
        String str = formatter.format(curDate);

方法二:
    String label = DateUtils.formatDateTime( 
            getApplicationContext(), 
            System.currentTimeMillis(), 
            DateUtils.FORMAT_SHOW_TIME 
                    | DateUtils.FORMAT_SHOW_DATE 
                    | DateUtils.FORMAT_ABBREV_ALL);


6、获得一个字符串(包括中文字符串)首字母的英文字母:
private final static int[] li_SecPosValue = { 1601, 1637, 1833, 2078, 2274,
        2302, 2433, 2594, 2787, 3106, 3212, 3472, 3635, 3722, 3730, 3858,
        4027, 4086, 4390, 4558, 4684, 4925, 5249, 5590 };
private final static String[] lc_FirstLetter = { "A", "B", "C", "D", "E",
        "F", "G", "H", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
        "T", "W", "X", "Y", "Z" };
// 获得每个string的首字母
/**
 * 取得给定汉字的首字母,即声母
 * @param chinese 给定的汉字
 * @return 给定汉字的声母
 */
public String getFirstLetter(String chinese) {
    if (chinese == null || chinese.trim().length() == 0) {
        return "";
    }
    chinese = this.conversionStr(chinese, "GB2312", "ISO8859-1");

    if (chinese.length() > 1) { // 判断是不是汉字
        int li_SectorCode = (int) chinese.charAt(0); // 汉字区码
        int li_PositionCode = (int) chinese.charAt(1); // 汉字位码
        li_SectorCode = li_SectorCode - 160;
        li_PositionCode = li_PositionCode - 160;
        int li_SecPosCode = li_SectorCode * 100 + li_PositionCode; // 汉字区位码
        if (li_SecPosCode > 1600 && li_SecPosCode < 5590) {
            for (int i = 0; i < 23; i++) {
                if (li_SecPosCode >= li_SecPosValue[i]
                        && li_SecPosCode < li_SecPosValue[i + 1]) {
                    chinese = lc_FirstLetter[i];
                    break;
                }
            }
        } else { // 非汉字字符,如图形符号或ASCII码
            chinese = this.conversionStr(chinese, "ISO8859-1", "GB2312");
            chinese = chinese.substring(0, 1);
        }
    }

    return chinese;
}

/**
 * 字符串编码转换
 * @param str 要转换编码的字符串
 * @param charsetName 原来的编码
 * @param toCharsetName 转换后的编码
 * @return 经过编码转换后的字符串
 */
private String conversionStr(String str, String charsetName,String toCharsetName) {
    try {
        str = new String(str.getBytes(charsetName), toCharsetName);
    } catch (UnsupportedEncodingException ex) {
        System.out.println("字符串编码转换异常:" + ex.getMessage());
    }
    return str;
}

7、中文字母按字典序排序:
private ArrayList<String> mItems;
Collections.sort(mItems, Collator.getInstance(java.util.Locale.CHINA)); // 排序

8、检查WIFI是否开启、连接:
    //是否连接WIFI
    public static boolean isWifiConnected(Context context)
    {
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return wifiNetworkInfo.isConnected();
    }


    /**** 打开WIFI***/
    public static boolean openWifi(Context context){
        return opclWifi(context, true);
    }
   
    /**** 关闭WIFI***/
    public static boolean closeWifi(Context context){
        return opclWifi(context, false);
    }
   
    /**** 打开关闭WIFI****/
    private static boolean opclWifi(Context context, boolean type){
        boolean result = true;
        // 获取WIFIManager实例
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
   
        if (wifiManager.isWifiEnabled() ^ type) {
             // 打开关闭WIFI
             result = wifiManager.setWifiEnabled(type);
        }
   
        return result;
    }

添加权限:

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

9、int数据转化成十六进制,二进制,八进制,无符号数字符串:

    public static void printInt(int i) {
    	System.out.println(Integer.toBinaryString(i));   // 二进制输出
    	System.out.println(Integer.toHexString(i));      // 十六进制输出
    	System.out.println(Integer.toOctalString(i));    // 八进制输出
    	System.out.println(Integer.toUnsignedString(i)); // 转化成无符号数输出
    	System.out.println(Integer.toString(i));         // 转化成String输出
    }
测试:

    	System.out.println("======== 输出正数 =========");
        int i = 100;
        printInt(i);
        System.out.println("======== 输出负 =========");
        i = -100;
        printInt(i);
输出结果:

======== 输出正数 =========
1100100
64
144
100
100
======== 输出负 =========
11111111111111111111111110011100
ffffff9c
37777777634
4294967196
-100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值