Android一滴滴筆記(不間斷更新)

本文涵盖了Android开发中的多个技巧和实践,包括字符串编码、应用程序安装判断、timer与线程使用心得、Activity启动模式介绍、Monkey压力测试、布局参数、SD卡创建、应用使用、Dialog与NumberPicker结合、Facebook SDK开发、CalendarView Bug处理、startActivityForResult与onActivityResult问题解决、Message消息处理、px转dp单位转换、应用样式与主题设置、通知与点击回运动界面、Webview自动适配屏宽、前端与后端开发工具设置等核心内容。

Android一滴滴筆記

17.空格编码 string.xml前后加空格的技巧

<string name="space">&#160;&#160;&#160;&#160;我来看空格</string>
&#160; 这个就代表着空格
或者在內容兩頭加""號
<string name="space">”    我来看空格   “</string>

16.Android 判断应用程序是否已安装

PackageInfo packageInfo;

try {
packageInfo = this.getPackageManager().getPackageInfo(
"com.twitter.android", 0);
} catch (NameNotFoundException e) {
packageInfo = null;
e.printStackTrace();
}
if(packageInfo ==null){
System.out.println("没有安装");
}else{
System.out.println("已经安装");
}

 


15.关于timer和线程的使用心得

最紧遇上一个需求,就是需要记录时间相差,并在指定时间内发送push。一开始使用的是线程,在线程里使用SystemClock.sleep做时间加1的操作,和累计之后发送push的判断。逻辑正确,但是时间上的速度加1和现实的时间却不同,原因在于线程sleep了1微秒,但是下面的执行的代码依然占用一定时间。后来改为了timer,指定每100微秒,时间上的确准了,但是因为频繁地使用导致电源消耗严重。最后,通过使用SystemClock.elapsedRealtime()在进入后台和回到app计算相距时间,在前台使用timer刷新



14.Android:lunchmode(Activity的四种启动模式介绍)


(1)standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
(2)singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
(3)singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
(4)singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;


13.Monkey壓力測試

啟動:

adb devices
adb shell
monkey -p package -v count  //  -p : packgae  ,  -v count

停止:
adb shell
top | grep monkey

top | grep monkey
5447  0   1% S    10 262960K  10328K     root     com.android.commands.monkey
5447  0   0% S    10 262960K  10324K     root     com.android.commands.monkey
 
找到id为5447,然后再kill掉就OK了
 
adb shell
kill -9 5447


12.Android佈局三個參數

1)fill_parent

 

设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为fill_parent将强制性让它布满整个屏幕。

 

2) wrap_content

 

设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为 wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置 Windows控件的Autosize属性为True。

 

3)match_parent 

   Android2.2中match_parent和fill_parent是一个意思 .两个参数意思一样,match_parent更贴切,于是从2.2开始两个词都可以用。那么如果考虑低版本的使用情况你就需要用fill_parent了

 

 

11.Android创建sdcard

Android创建sdcard步骤一、cmd进入tools目录输入mksdcard -l mycard 100M F:\mysdcard.img

 

10.Application的使用

    每個APP都會有一個Application

Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(singleton)模式的一个类。

    通常我们是不需要指定一个Application的,系统会自动帮我们创建,如果需要创建自己的Application,那也很简单!创建一个类继承Application并在AndroidManifest.xml文件中的application标签中进行注册(只需要给application标签增加name属性,并添加自己的 Application的名字即可)。

 

 

9.在Dialog裡顯示NumberPicker

NumberPicker np=new NumberPicker(mActivity);

np.setMaxValue(2050);

np.setMinValue(1900);

np.setValue(2014);

np.setWrapSelectorWheel(false);//設置不能循環

np.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);//設置不能編輯

AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);

builder.setTitle(R.string.tab_calories_height);

builder.setView(np);

builder.setPositiveButton(R.string.tab_calories_yes,

new DialogInterface.OnClickListener() {

 

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

// tv_gender.setText(genders[position]);

}

});

builder.create().show();

 

8.android開發facebookSDK

http://blog.youkuaiyun.com/chococlatetan/article/details/40049153

 

7.CalendarView的一個bug

    CalendarView的setOnDateChangeListener事件,似乎在滑動的時候也會觸發,明明裡面的日期是沒有變化卻會同樣觸發。

 

6.startActivityForResult與onActivityResult一些問題

6.1提前執行onActivityResult的原因是在AndroidManifest裡面設置了需要接受傳遞的activity的launchMode模式

    这与 Activity 的加载模式(launchMode)有关,该属性可以在 AndroidManifest.xml 中设置。

原先将其设为 singleInstance,经测试,所有需要传递或接收的 Activity 不允许设置该属性,或只能设为标准模式,否则系统将在 startActivityForResult() 后直接调用 onActivityResult()。

 

6.2调用startActivityForResult后,onActivityResult无响应的问题

    两个activity传递数据和返回数据时,请求方的onActivityResult始终无响应,通过debug调试模式也没见调用该方法。查看了各种配置和程序代码,均未发现有错误之处。后面找了很多资料,总算看到一个朋友说是调用startActivityForResult的参数问题,即调用时这样:

startActivityForResult(intent, 0);

是第二个参数的问题,该参数必须大于0才能在返回值,并激活onActivityResult方法。

我最开始是用的一个activity默认的常量:RESULT_OK,跟踪了代码后发现,该常量的值为-1,当然没法激活 onActivityResult方法了,随后随便修改为一个大于0的整数,程序即通跑成功。

startActivityForResult(intent, 1); //这样就行了

startActivityForResult(Intent intent, Int requestCode);

setResut(int resultCode, Intent intent);

onActivityResult(int requestCode, int resultCode, Intent intent);

 

6.3使用startActivityForResult ERR==WARN/ActivityManager(67): Activity is launching as a new task, so cancelling activity result

    最近使用startActivityForResult,出错,跟踪后发现activity并没有被启动,而是直接执行 onActivityResult。后查看日志发现“05-19 02:11:19.822: .”

原来是我把要启动的activity的launchmode设置成singleTask了。

 

5.為什麼使用Message m = new Message()與 Message message= Message.obtain()

从obtain()的源代码中我们可以知道,它是静态方法,而且只有在spool = null 的情况下才会new出一个Message(),返回一个Message对象,如果在不为空的情况下,Message的对象都是从Message对象池里面拿的实例从而重复使用的,这也为了Android中的Message对象能够更好的回收。

 

4.px2dp & dp2px

public class DensityUtil {  

  

    /** 

     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 

     */  

    public static int dip2px(Context context, float dpValue) {  

        final float scale = context.getResources().getDisplayMetrics().density;  

        return (int) (dpValue * scale + 0.5f);  

    }  

  

    /** 

     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 

     */  

    public static int px2dip(Context context, float pxValue) {  

        final float scale = context.getResources().getDisplayMetrics().density;  

        return (int) (pxValue / scale + 0.5f);  

    }  

}

 

3.Set android style and theme in app

http://trinea.iteye.com/blog/1450683

 

2.//添加notification和點擊notification回到運動界面

Intent notificationIntent = new Intent(mContext, mContext.getClass()); 

notificationIntent.setAction(Intent.ACTION_MAIN);

notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);

 

PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);

 

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mActivity)

.setTicker(ticker)

.setSmallIcon(R.drawable.ic_launcher)

.setContentTitle(title)

.setContentText(text)

.setContentIntent(contentIntent);

                

NotificationManager mNotificationManager = (NotificationManager) mActivity

.getSystemService(mActivity.NOTIFICATION_SERVICE);

// mId allows you to update the notification later on.

mNotificationManager.cancel(1);

mNotificationManager.notify(1, mBuilder.build());

 

1.webview自動適配屏寬

webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL); 

webView.getSettings().setUseWideViewPort(true);

webView.getSettings().setLoadWithOverviewMode(true);

webView.loadUrl(Uri.fromFile(file).toString());

 

Webview詳細設置:

http://www.cnblogs.com/cc-Cheng/archive/2012/10/26/2740875.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值