开发技巧杂集

转贴自:[url]http://blog.csdn.net/liangguohuan/archive/2010/10/18/5949267.aspx[/url]

1.检查是否有网络连接


public static boolean isNetworkAvailable(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null && info.isConnected());
}



2.全屏和无标题


// 全屏 ( No Statusbar )
getWindow (). setFlags ( WindowManager . LayoutParams . FLAG _ FULLSCREEN ,
WindowManager . LayoutParams . FLAG _ FULLSCREEN );
// 无标题栏 ( No Titlebar )
requestWindowFeature ( Window . FEATURE _ NO _ TITLE );


3.使用ViewStub延迟展开视图


1 ) 定义 ViewStub
< ViewStub android : id = "@+ id / stub _ import "
android : inflatedId ="@+ id / panel _ import "
android : layout ="@ layout / progress _ overlay "
android : layout _ width =" fill _ parent "
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>
2 )展开视图
findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// 或者 获取视图
View importPanel = ((ViewStub)
findViewById(R.id.stub_import)).inflate();


4.删除窗口背景

1) 编码实现


public void onCreate(Bundle icicle){
super.onCreate(icicle);
setContentView(R.layout.mainview);
// 删除窗口背景
getWindow().setBackgroundDrawable(null);
...
}


2 )自定义主题实现


<resources>
<mce:style name="NoBackgroundTheme" parent="android:Theme"><!--
<item name="android:windowBackground">@null</item>
--></mce:style><style name="NoBackgroundTheme" parent="android:Theme" mce_bogus="1"><item name="android:windowBackground">@null</item></style>
</resources>


6.横竖屏切换时不重新加载 onCreate()

为了防止横竖屏切换时 Activity 重新加载 onCreate ,
只需要在 Activity 的配置文件里添加属性:
android:configChanges="orientation|keyboardHidden|navigation"

7.半透明主题

1.Resource source file location : res/values/styles.xml
<style name="myTranslucentTheme" parent="android:style/Theme.Translucent">
<item name="android:windowBackground">@drawable/bg</item>
</style>
其中 bg 为一张半透明图片的索引
2. 使用自定义半透明主题
AndroidManifest.xml


<activity android:name=".WallpaperActivity"
android:label="@string/wallpaper_titile"
android:theme="@style/myTranslucentTheme">
</activity>


8.获取Android手机上的图片和视频缩略图

大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲、图片和视频等信息,如果我们需要快速提取图片和视频缩略图可以直接访问 android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails这两个数据库,即可查询出来缩略图

如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri我们可以转成String,这里保存着Android手机SD卡上的多媒体文件完整路径,

有关具体的缩略图可以通过getThumbnail(ContentResolver cr, long origId, int kind, BitmapFactory.Options options) 或getThumbnail(ContentResolver cr, long origId, long groupId, int kind, BitmapFactory.Options options) 方法获取,这两种方法返回Bitmap类型,而缩略图的分辨率可以从HEIGHT和WIDTH两个字段提取,在Android上缩略图分为两种,通过读取 KIND字段来获得,分别为MICRO_KIND和MINI_KIND 分别为微型和迷你两种缩略模式,前者的分辨率更低。这样我们平时获取文件系统的某个图片预览时,可以直接调用系统缩略图,而不用自己重新计算。

最后Android123提示大家,缩略图保存在SD卡的DCIM目录,里面的.thumbnails是图片的,而.video_thumbnails是视频的,这两个文件夹为隐藏属性,一般的文件管理器都可以看到。

9.Android ANR介绍与避免

很多初入Android开发的网友可能发现ANR的字样,到底Android ANR是什么呢? 其实ANR就是Application Not Responding的全称,当某个应用处于长期假死状态时Android系统会弹出一个窗口上面写道,XXX is not responding给出两个按钮一个为force close一个为wait。

可能触发ANR的情况

1. 长时间的I/O处理,比如读写大文件,网络访问时造成的阻塞。

2. 执行耗时的运算,Android默认为超过5000ms即5秒开始弹出ANR窗口,某些应用可能首次执行时没有缓存十分耗时,可以通过Splash播放闪屏Logo等方式来延缓加载

3. Service和appWidget中也要注意多线程的使用,除非它和Activity工作在不同的进程。

避免ANR的方法

1. 单独开工作者线程,通过独立的Thread或使用类似AsyncTask的方式来处理耗时的内容。

2. 耗时的操作尽量分段处理,使用类似状态机的方法,类似Symbian的活动对象将一个复杂的事情,分段执行。

3. UI线程中不要处理过多的内容,比如将一个5MB的文本,让TextView去setText,要知道这种UI操作,没有什么好方法去解决的,所以Android123提示,遇到UI中需要执行复杂的操作,可以参考上面2提到的分段处理方式。

10.AsyncTask对比Thread加Handler

很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里 Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有事可能消息队列阻塞或其他原因无法准确的使用。

Android开发网推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在 Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比 Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及 Looper可能更灵活。

11.android.os.Debug调试工具使用方法

在Android软件开发中最终的性能测试和调试显得至观重要,今天Android123和大家一起讨论下Google送给我们的android.os.Debug类,使用起来比较简单,我们先导入 import android.os.Debug这个包。

在需要开始跟踪的地方加入 Debug.startMethodTracing(“/sdcard/cwj”);

最终在停止调试的地方加入 Debug.stopMethodTracing();

最终在sdcard上生成的cwj文件我们可以用sdk\tools中的traceview来查看运行的结果。

12.TextView多行本文滚动轻松实现

Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局。只要在layout中简单设置几个属性就可以轻松实现


<TextView
android:id="@+id/tvCWJ"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" <!--垂直滚动条 -->
android:singleLine="false" <!--实现多行 -->
android:maxLines="15" <!--最多不超过15行 -->
android:textColor="#FF0000"
/>


当然我们为了让TextView动起来,还需要用到TextView的setMovementMethod方法设置一个滚动实例,代码如下


TextView tvAndroid123 = (TextView)findViewById(R.id.tvCWJ);
tvAndroid123.setMovementMethod(ScrollingMovementMethod.getInstance()); // Android开发网提示相关的可以查看SDK中android.text.method分支了解更多


12.Widget简单制作流程

1、在 OnUpdate()中 定义一个 Intent
Intent startActivityIntent = new Intent(context,WidgetLife.class);
2、实例化一个 PendingIntent
PendingIntent Pintent = PendingIntent.getActivity(context,0,startActivityIntent,0);
3、实例RemoteView
RemoteViews ActivityView = new RemoteViews(context.getPackageName(),R.layout.widget_layout);
4、Button 事件
ActivityView.setOnClickPendingIntent(R.id.Button,Pintent);
5、更新Widget
appWidgetManager.updateAppWidget(appWidgetIds,ActivityView);

12.对话框【Dialog】去除白色边框代码

边框, Dialog, Android, 对话框, 代码
使用样式文件,在values 目录下新建styles.xml文件,编写如下代码:


<resources>
<mce:style name="dialog" parent="@android:style/Theme.Dialog"><!--
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/black</item>
<item name="android:windowBackground">@null</item>
<item name="android:backgroundDimEnabled">false</item>

--></mce:style><style name="dialog" parent="@android:style/Theme.Dialog" mce_bogus="1"> <item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/black</item>
<item name="android:windowBackground">@null</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>


调用时,使用AlerDialog的接口类,Dialog 接口编写如下代码:


Dialog dialog = new Dialog(SetActivity.this, R.style.dialog);
dialog.setContentView(R.layout.test);
dialog.show();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值