Android中一些有用的小方法(不定时更新)
2014-03-17 10:57
513 查看
在Android中,有些方法非常有用,但是一时想不起来怎么用。所以将这些方法积累在这里,自己可以时常上来看看熟悉一下,如果能够帮到朋友们就更好了。
使用方法:
扩展用法:
将这个时间转换成人类可读的时间。也就是转换成年月日的形式。(代码参考自:xiaanming酱的博客。)
定义了Config类,并且在类中对获取数值进行了包装。详情见QuickSearchBox源码。
使用方法:
详细方法实现:
该数值在values/config.xml里面设定。
应用中需要频繁发送一些信息。
应用场景:
字串匹配等。
注意mUpdateSuggestionsTask是Runnable对象。如果不使用第一个removeCallbacks可能会导致该Runnable执行多次。
来显示所有的命令说明。但是一般我们需要用到的是具体的命令,最好是直接就能用的,比较适合我这种懒人。
比如要监控WindowsManager这个TAG,那么运行一下命令即可:
-b是将默认监听的main缓冲切换到system(这两个数值都在命令说明里面可以找到),并且增加一个过滤器只看tag为“
WindowManager”的log。这个知识参考这篇文章。
下面simState的类型包括如下几类:
可以通过返回值的判断,来确定SIM卡的状态。
可以看到,设置了intent内容,也就是点击该菜单会跳转到哪里去。该点击事件会导致从Settings模块跳转到Phone模块的MobileNetWorkSettings这个PreferenceActivity子类中来。
判断是否有卡:
注意,实际上SIM_STATE_UNKNOWN并不能判断是否处于飞行模式,该状态的定义可以知道,关闭飞行模式,搜索网络过程中,也是处于该状态,如果对于飞行状态有严格的要求的话,最好不要用状态是否非UNKOWN来判断是否处于飞行模式。
判断飞行模式:
Path------>Configure Build Path。在Libraries标签里面点击Add Library...选择User Library--->User Libraries---->New-->填写库名称(注意勾选上System Library选项)--->Add External JARs...将拷贝到本地的那些jar包(最好根据模块把将class.jar重命名)导入进去。确定之后在Java Build Path的Order and Export将刚才新建的库顺序放到最前面。
有些类不知道怎么找到底在哪个模块的class.jar里面?
在out/target/common里面调用grep搜索,例如:grep -w "Telephony" ./ -r
该应用在包com.android.settings.fuelgauge;中添加了一个名为:PowerRankingFragment的类。如果要通过intent启动,那么intent各项设置如下:
如何禁用ActionBar的向上导航功能
参考代码
getActionBar().setDisplayHomeAsUpEnabled(false);
如果是在一个Fragment里面,可以参考:
getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);
获取当前系统时间
前置条件: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="<span style="color:#ff0000;">.preferences.SearchSettingsActivity</span>" 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="<span style="color:#ff0000;">Settings$WirelessSettingsActivity</span>" 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子类中来。
是否有卡以及是否处于飞行模式
参考的高通代码WirelessSettings.java里面的函数:判断是否有卡:
private boolean hasSimCard() { MSimTelephonyManager multiSimManager = MSimTelephonyManager.getDefault(); if (multiSimManager.isMultiSimEnabled()) { int numPhones = multiSimManager.getPhoneCount(); for (int i = 0; i < numPhones; i++) { // Because the status of slot1/2 will return // SIM_STATE_UNKNOWN under airplane mode. if (multiSimManager.getSimState(i) != TelephonyManager.SIM_STATE_ABSENT) { return true; } } } else { TelephonyManager singleSimManager = TelephonyManager.getDefault(); if (singleSimManager.getSimState() != TelephonyManager.SIM_STATE_ABSENT) { return true; } } return false; }
注意,实际上SIM_STATE_UNKNOWN并不能判断是否处于飞行模式,该状态的定义可以知道,关闭飞行模式,搜索网络过程中,也是处于该状态,如果对于飞行状态有严格的要求的话,最好不要用状态是否非UNKOWN来判断是否处于飞行模式。
判断飞行模式:
public static boolean getAirplaneMode(Context context){ int isAirplaneMode = Settings.System.getInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON, 0) ; return (isAirplaneMode == 1)?true:false; }
导入系统应用到Eclipse
我们有时候会需要将系统应用导入到Eclipse中,这样修改的代码就可以用Eclipse的自动检查和提示功能,减少花在代码上的精力,这样可以更多着眼于业务逻辑上。需要的包在alps\out\target\common\obj\JAVA_LIBRARIES\(一般系统模块的包在这里,比如framework、telephony-common等)和alps\out\target\common\obj\APP。一般导入之后,出现的找不到对应类的错误都可以通过导入系统jar包或者应用jar包解决。导入方法为:右击项目,BuildPath------>Configure Build Path。在Libraries标签里面点击Add Library...选择User Library--->User Libraries---->New-->填写库名称(注意勾选上System Library选项)--->Add External JARs...将拷贝到本地的那些jar包(最好根据模块把将class.jar重命名)导入进去。确定之后在Java Build Path的Order and Export将刚才新建的库顺序放到最前面。
有些类不知道怎么找到底在哪个模块的class.jar里面?
在out/target/common里面调用grep搜索,例如:grep -w "Telephony" ./ -r
如何启动Settings模块中某个Fragment
在一个应用开发中碰到这个问题,各种组合终于找到了启动方法:该应用在包com.android.settings.fuelgauge;中添加了一个名为:PowerRankingFragment的类。如果要通过intent启动,那么intent各项设置如下:
ComponentName c = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerRankingFragment"); packageName = c.getPackageName(); className = "com.android.settings.fuelgauge.PowerRankingFragment";
Intent intent = new Intent(); intent.setClassName(packageName, className); startActivity(intent);这样就可以启动目标fragment了。这里要注意的是设定的包名和类名。
系统找不到指定的批处理标签 - exitBAT
记住要跳转到的标签exitBAT前面加冒号,而不是加到后面。GOTO exitBAT . . . :exitBAT exit
如何禁用ActionBar的向上导航功能
参考代码getActionBar().setDisplayHomeAsUpEnabled(false);
如果是在一个Fragment里面,可以参考:
getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);
相关文章推荐
- android一些有用的方法,代码,和错误处理总结(持续更新)
- Android 开发一些有用的链接地址(持续更新中)
- 关于神经网络的一些有用的网站(不定时更新)
- Android View不为人知的各种小属性和一些有用的小方法
- OC中一些常用小方法(不定时更新)
- [Android那些破事]Android的一些异常解决——不定时更新
- Android开发有用的一些网站,不断更新
- 关于android初学时一些问题的解决方法资料(持续更新)
- android的一些比较有用的方法
- Android一些小知识-不定时更新
- Android开发中很少人才知道的一些解决小错误的方法(一直更新中)
- Android 学习出现的一些error 及其解决方法(持续更新中...)
- iOS常见又通用的一些小方法集合(不定时更新,欢迎补充)
- 使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- android的jni使用方法的一些探索和研究
- Android中一些方法的区别
- 探讨android更新UI的几种方法
- 一些好用的方法,编写游戏的时候可能用的上!不断更新中_2009_04_23
- Python:Python中较使用的一些方法(持续更新)
- 关于Android SDK Manager更新速度慢的解决方法