Android中一些有用的小方法(不定时更新)

在Android中,有些方法非常有用,但是一时想不起来怎么用。所以将这些方法积累在这里,自己可以时常上来看看熟悉一下,如果能够帮到朋友们就更好了。


获取当前系统时间

前置条件:

import android.os.SystemClock;

使用方法:

 long  startTime = SystemClock.uptimeMillis();

扩展用法:

将这个时间转换成人类可读的时间。也就是转换成年月日的形式。(代码参考自:xiaanming酱的博客。)

/** 
 * 将毫秒数转换成yyyy-MM-dd-HH-mm-ss的格式 
 * @param milliseconds 
 * @return 
 */  
private String paserTime(long milliseconds) {  
    System.setProperty("user.timezone", "Asia/Shanghai");  
    TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");  
    TimeZone.setDefault(tz);  
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");  
    String times = format.format(new Date(milliseconds));  
      
    return times;  
}

应用中配置参数化

前置条件:

定义了Config类,并且在类中对获取数值进行了包装。详情见QuickSearchBox源码。

使用方法:

long delay = getConfig().getTypingUpdateSuggestionsDelayMillis();

详细方法实现:

public boolean showSuggestionsForZeroQuery() {        
      return mContext.getResources().getBoolean(R.bool.show_zero_query_suggestions);
}

该数值在values/config.xml里面设定。


一种更好的消息处理方法

前置条件:

应用中需要频繁发送一些信息。

应用场景:

字串匹配等。

    private void updateSuggestionsBuffered() {
        if (DBG) Log.d(TAG, "updateSuggestionsBuffered()");
        mHandler.removeCallbacks(mUpdateSuggestionsTask);
        long delay = getConfig().getTypingUpdateSuggestionsDelayMillis();
        mHandler.postDelayed(mUpdateSuggestionsTask, delay);
    }

注意mUpdateSuggestionsTask是Runnable对象。如果不使用第一个removeCallbacks可能会导致该Runnable执行多次。

确保某方法只在主线程中调用

比如某些会更新UI的方法,就需要在该方法开始的地方判断当前线程是否是主线程。判断逻辑如下所示:

    protected void checkThread() {
        if (Looper.myLooper() != Looper.getMainLooper()) {
            throw new IllegalStateException("Accessed Application object from thread "
                    + Thread.currentThread().getName());
        }
    }

AndroidManifest中,每个tag中如何声明android:name

如果是在程序包下面还有子文件夹,那么使用如下方式声明:
<activity android:name=".preferences.SearchSettingsActivity"
                android:label="@string/search_settings"
                android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.search.action.SEARCH_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.search.action.WEB_SEARCH_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
原始包名是com.android.quicksearchbox。而该类在这个路径下面的子文件夹里面,所以声明的时候用"."来进行子路径的表示。还有另外一种方式,如果在某一个类里面声明了另外一个内部类,在tag里面需要引用,那么就如下所示(注意$符号):
<activity android:name="Settings$WirelessSettingsActivity"
                android:taskAffinity="com.android.settings"
                android:label="@string/wireless_networks_settings_title"
                android:parentActivityName="Settings">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />                
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>            
        </activity>

Logcat用法

可以在命令行,运行下面的命令:

adb logcat -help

来显示所有的命令说明。但是一般我们需要用到的是具体的命令,最好是直接就能用的,比较适合我这种懒人。

比如要监控WindowsManager这个TAG,那么运行一下命令即可:

adb logcat -b system -s "WindowManager"

-b是将默认监听的main缓冲切换到system(这两个数值都在命令说明里面可以找到),并且增加一个过滤器只看tag为“

WindowManager”的log。这个知识参考这篇文章。

判断手机中是否有SIM卡

可以通过TelephonyManager中提供的方法来判断,代码如下:

import android.telephony.TelephonyManager;
TelephonyManager mTm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
int simState = mTm.getSimState();

下面simState的类型包括如下几类:

    /** 当处于状态间跳转时. */
    public static final int SIM_STATE_UNKNOWN = 0;
    /** 设备中无SIM卡 */
    public static final int SIM_STATE_ABSENT = 1;
    /** 处于锁定状态 */
    public static final int SIM_STATE_PIN_REQUIRED = 2;
    /** PUK锁定状态 */
    public static final int SIM_STATE_PUK_REQUIRED = 3;
    /** 网络PIN锁定状态 */
    public static final int SIM_STATE_NETWORK_LOCKED = 4;
    /** SIM卡已就绪 */
    public static final int SIM_STATE_READY = 5;
    /** SIM卡存在,但是有错误。废卡之类的
     *@hide
     */
    public static final int SIM_STATE_CARD_IO_ERROR = 6;

可以通过返回值的判断,来确定SIM卡的状态。


如何在应用的PreferenceScreen中应用其他模块的偏好菜单

最简单的就是如下方式

    <PreferenceScreen
        android:key="mobile_network_settings"
        android:title="@string/network_settings_title"
        android:dependency="toggle_airplane">
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="com.android.phone"
            android:targetClass="com.android.phone.MobileNetworkSettings" />
    </PreferenceScreen>

可以看到,设置了intent内容,也就是点击该菜单会跳转到哪里去。该点击事件会导致从Settings模块跳转到Phone模块的MobileNetWorkSettings这个PreferenceActivity子类中来。













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值