‘编程学习’ 分类下的所有文章
2011五月19

Android:设置APN为cmnet源码

public class APNActivity extends Activity {

        public static final Uri APN_URI = Uri.parse("content://telephony/carriers");
        public static final Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn");

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                int _cmnetId = addAPN();
                SetAPN(_cmnetId);
        }
       public void checkAPN(){
      // 检查当前连接的APN
              Cursor cr = getContentResolver().query(CURRENT_APN_URI, null, null,
              null, null);
              while (cr != null && cr.moveToNext()) {
                  // APN id
                  String id = cr.getString(cr.getColumnIndex("_id"));
                  // APN name
                  String apn = StringUtils.null2String(cr
                  .getString(cr.getColumnIndex("apn")));
                  // Toast.makeText(getApplicationContext(),
                  // "当前 id:" + id + " apn:" + apn, Toast.LENGTH_LONG).show();

       }

        //新增一个cmnet接入点
        public int addAPN() {
                int id = -1;
                ContentResolver resolver = this.getContentResolver();
                ContentValues values = new ContentValues();
                values.put("name", "cmnet");
                values.put("apn", "cmnet");
                Cursor c = null;
                Uri newRow = resolver.insert(APN_URI, values);
                if (newRow != null) {
                        c = resolver.query(newRow, null, null, null, null);
                        int idIndex = c.getColumnIndex("_id");
                        c.moveToFirst();
                        id = c.getShort(idIndex);
                }
                if (c != null)
                        c.close();
                return id;
        }
        //设置接入点
        public void SetAPN(int id) {
                ContentResolver resolver = this.getContentResolver();
                ContentValues values = new ContentValues();
                values.put("apn_id", id);
                resolver.update(CURRENT_APN_URI, values, null, null);
        }
}
2011五月18

Android:实用代码(开启启动、建立GPRS连接、闹钟等)

1:查看是否有存储卡插入

String status=Environment.getExternalStorageState();
if(status.equals(Enviroment.MEDIA_MOUNTED))
{
说明有SD卡插入
}

2:让某个Activity透明

OnCreate中不设Layout
this.setTheme(R.style.Theme_Transparent);

以下是Theme_Transparent的定义(注意transparent_bg是一副透明的图片)

3:在屏幕元素中设置句柄

使用Activity.findViewById来取得屏幕上的元素的句柄. 使用该句柄您可以设置或获取任何该对象外露的值.
TextView msgTextView = (TextView)findViewById(R.id.msg);
msgTextView.setText(R.string.push_me);

4:发送短信

String body=”this is mms demo”;

Intent mmsintent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(”smsto”, number, null));
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body);
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true);
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true);
startActivity(mmsintent);

5:发送彩信

StringBuilder sb = new StringBuilder();

sb.append(”file://”);

sb.append(fd.getAbsoluteFile());

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(”mmsto”, number, null));
// Below extra datas are all optional.
intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject);
intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body);
intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString());
intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode);
intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent);

startActivity(intent);

6:发送Mail

mime = “img/jpg”;
shareIntent.setDataAndType(Uri.fromFile(fd), mime);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(fd));
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject);

shareIntent.putExtra(Intent.EXTRA_TEXT, body);

7:注册一个BroadcastReceiver

registerReceiver(mMasterResetReciever, new IntentFilter(”OMS.action.MASTERRESET”));

private BroadcastReceiver mMasterResetReciever = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent){
String action = intent.getAction();
if(”oms.action.MASTERRESET”.equals(action)){
RecoverDefaultConfig();
}
}

};

8:定义ContentObserver,监听某个数据表

private ContentObserver mDownloadsObserver = new DownloadsChangeObserver(Downloads.CONTENT_URI);

private class DownloadsChangeObserver extends ContentObserver {
public DownloadsChangeObserver(Uri uri) {
super(new Handler());

}

@Override
public void onChange(boolean selfChange) {}
}

9:获得 手机UA

public String getUserAgent()
{
String user_agent = ProductProperties.get(ProductProperties.USER_AGENT_KEY, null);
return user_agent;
}

10:清空手机上Cookie

CookieSyncManager.createInstance(getApplicationContext());
CookieManager.getInstance().removeAllCookie();

11:建立GPRS连接

//Dial the GPRS link.
private boolean openDataConnection() {
// Set up data connection.
DataConnection conn = DataConnection.getInstance();

if (connectMode == 0) {
ret = conn.openConnection(mContext, “cmwap”, “cmwap”, “cmwap”);
} else {
ret = conn.openConnection(mContext, “cmnet”, “”, “”);
}

}

12:PreferenceActivity 用法

public class Setting extends PreferenceActivity

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}

Setting.xml:

Android:key=”seting2″
android:title=”@string/seting2″
android:summary=”@string/seting2″/>

android:key=”seting1″
android:title=”@string/seting1″
android:summaryOff=”@string/seting1summaryOff”
android:summaryOn=”@stringseting1summaryOff”/>

13:通过HttpClient从指定server获取数据

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet method = new HttpGet(“http://www.baidu.com/1.html”);
HttpResponse resp;
Reader reader = null;
try {
// AllClientPNames.TIMEOUT
HttpParams params = new BasicHttpParams();
params.setIntParameter(AllClientPNames.CONNECTION_TIMEOUT, 10000);
httpClient.setParams(params);
resp = httpClient.execute(method);
int status = resp.getStatusLine().getStatusCode();

if (status != HttpStatus.SC_OK) return false;

// HttpStatus.SC_OK;
return true;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (reader != null) try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

14:显示toast

Toast.makeText(this._getApplicationContext(), R.string._item, Toast.LENGTH_SHORT).show();

15:屏幕显示

程序中默的显示是带有标题栏和系统信息栏的,有的时候,这很影响程序界面的美观。手机默认的是竖屏,或与感应器状态相关,为了某种效果,我们的程序需要限制使用横屏或竖屏。以下的代码就解决了上述问题。

//设置为无标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置为横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

16:Intent传参

当Activity与Activity/Service(或其它情况)有时与要进行参数传递,最常用也是最简单的方式就是通过Intent来处理。
看如下代码:
Intent intent = new Intent(…);
Bundle bundle = new Bundle();
bundle.putString(“NAME”, “zixuan”);
intent.putExtras(bundle);
context.startActivity(intent); 或 context.startService(intent);

当然,有传送就有接收,接收也很简单,如:
Bundle bunde = intent.getExtras();
String name = bunde.getInt(“NAME”);
当然参数KEY要与传送时的参数一致。

17:获取手机号

在j2me中,根本没有办法获取用户的手机号码,就连获取手机串号(IMEI)都基本上无法实现,然后在android手机上一切都是如此的简单,看代码:
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String tel = tm.getLine1Number();
看来,android的确加速了j2me的消亡。

18:振动器

总感觉手机上的振动器没有多大用处(当然静音模式下的振铃很有用),但还是顺带着说一下吧,只有两行代码:
1、获取振动服务的实例
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
2、设置振动时长,单位当然也是ms
vibrator.vibrate(1000);
如果你觉得这样过去单调的话,可以设个节奏:
vibrator.vibrate(new long[]{10, 100, 20, 200}, -1);
两个参数,习惯告诉我第一个是节奏,第二个是重复次数,可事实并没有这么简单,我翻译不好,大家还是看原文吧:
public void vibrate (long[] pattern, int repeat)
pattern: an array of longs of times to turn the vibrator on or off.
repeat: the index into pattern at which to repeat, or -1 if you don’t want to repeat.
google喜欢弄些技巧,我却觉得这里有点弄巧成拙了。

19:闹钟管理

最近看了一下Android的闹钟管理类(AlarmManager),真不错误,强大又简单,代码如下:

1)、建立一个AlarmReceiver继承入BroadcastReceiver,并在AndroidManifest.xml声明
public static class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, “闹钟提示:时间到!”, Toast.LENGTH_LONG).show();
}
}

2)、建立Intent和PendingIntent,来调用目标组件。
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

3)、设置闹钟
获取闹钟管理的实例:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
设置单次闹钟:
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000), pendingIntent);
设置周期闹钟:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);

20:开机自启动

1).定义一个BroadcastReceiver

public class BootReceiver extends BroadcastReceiver {
public void onReceive(Context ctx, Intent intent) {
Log.d(“BootReceiver”, “system boot completed”);
//start activity
String action=”android.intent.action.MAIN”;
String category=”android.intent.category.LAUNCHER”;
Intent myi=new Intent(ctx,CustomDialog.class);
myi.setAction(action);
myi.addCategory(category);
myi.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(myi);
//start service
Intent s=new Intent(ctx,MyService.class);
ctx.startService(s);
}
}

2).配置Receiver的许可,允许接收系统启动消息,在AndroidManifest.xml中:

3).配置Receiver,可以接收系统启动消息,在AndroidManifest.xml中






4).启动模拟器,可以看到系统启动后,弹出一个对话框。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxh2808/archive/2010/10/30/5976351.aspx

2011五月13

杯具程序员

上联:为系统而生,为框架而死,为debug奋斗一辈子。
下联:吃符号的亏,上大小写的当,最后死在需求上!
横批:杯具程序员。

2011五月4

Android 手机端与服务端POST数据交互类

 

package com.wizzer.tools;

import java.io.*;
import java.net.URLEncoder;

import java.util.*;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;

public class BaseProtocol 
{
	private StringBuilder sb = new StringBuilder();
	private HttpClient httpClient;
	private HttpPost httpRequest;
	private HttpResponse response;
	private List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
	private static final int DIALOG1_KEY = 0;
	private static final int DIALOG2_KEY = 1;

	public BaseProtocol()
	{
		httpClient = new DefaultHttpClient();
	}

	/**
	 * *向服务器端发送请求 * *@paramurl *@throwsException
	 * 
	 * @throws UnsupportedEncodingException
	 */
	public void pack(String url) throws Exception
	{
		httpClient = new DefaultHttpClient();
		httpRequest = new HttpPost(url);
		httpRequest.setEntity(new UrlEncodedFormEntity(nameValuePair));
		response = httpClient.execute(httpRequest);
	}

	/** *得到返回数据 * *@paramurl *@return *@throwsException */

	public String parse() throws Exception
	{
		// TODO状态处理500200
		if (response.getStatusLine().getStatusCode() == 200)
		{
			BufferedReader bufferedReader2 = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
			for (String s = bufferedReader2.readLine(); s != null; s = bufferedReader2.readLine())
			{
				sb.append(s);
			}
		}
		return sb.toString();
	}

	/***
	 * 向服务器发送信息 * *@paramkey *@paramvalue
	 * 
	 * @throws UnsupportedEncodingException
	 */
	public void addNameValuePair(String key, String value) throws UnsupportedEncodingException
	{
		nameValuePair.add(new BasicNameValuePair(key, URLEncoder.encode(value, HTTP.UTF_8)));
	}

	/** *返回JSONArray对象数据模型 * *@return *@throwsJSONException */

	public JSONArray getJSON() throws JSONException
	{
		return new JSONArray(sb.toString());
	}

}
2011五月4

合肥 Android/Java开发交流群:26310065

手机开发:WM、Android、iOS
WEB开发:Java、.NET、ASP、PHP、JSP
应用开发:C#、JAVA……

欢迎IT从业人士加入,交流开发经验、技术,项目外包等信息。
QQ群:26310065

2011四月8

告别程序员生涯,一点感慨与诸君共勉

再过几天,我就正式告别程序员生涯了,这也是我最后一次以职业程序员身份在CSDN发表文章。小弟谈谈入行几年来的感受,做一个人生阶段的自我总结,同时希望能给后来者带来点参考意见,能在这段路上走的更好。

本人2002年下半年正式入行,至今2007年4月一直从事软件开发工作。

上大学选择这个专业是阴差阳错,但接触之后对计算机产生了强烈的兴趣,对写软件有一种强烈的冲动。软件成型后,那种成就感和自豪感能给我难以名状的满足。

那时,喜欢看侯捷的书,对核心技术和核心技术人员由衷的崇拜,对技术的追求和水平的提高有一种莫名的狂热,当时我想只要能从事软件开发的工作,起初的薪金待遇可以不计,等我技术方面成熟后,自己就有更高更好的选择了,程序员-系统分析-项目经理-自己的软件公司,这是当时我一个朦胧的程序人生规划。

现在想来,不禁一番唏嘘。

我记得我在培训的时候,一个培训的老师当时是本地一家有名的高科技企业的CTO,确实是专业人才,就是不太会讲课。我问他做程序员的感受,他说经常写程序经常写到凌晨2点钟,很累不过很有意思,因为他喜欢这份职业(当然喜欢啊,他月薪7000-8000,2001年,济南),但也干不长啊,他已经做好了转行的准备,去做和计算机相关的行业。那年他28岁,我22岁。其实他那番话让我和我的同学已经很羡慕,我们羡慕他的技术深度和现在的岗位层次,金领啊,他就是我们眼里的金领啊。

而另一个技术水平很高的老师(在外企写单片机的,30岁,月薪8000-1万),告诉我的是:迟早要转行,就像他现在来当培训教师一样,原因:太累。

我没在乎他们的感慨,因为我年轻啊,加班到夜里2点很轻松啊,何况写写自己喜欢的软件,很高兴啊。30岁那时对我来说只是一个遥远的数字。工作后,感觉完全不一样了。首先很惭愧自己的机遇和能力都不是太好,一直从事基于数据库的信息管理系统的开发(我认为是软件开发里最简单和最基础的方面),换了三家公司,从基础程序员作到了系统分析的层次,现在开始往对外和管理方面发展。可以说粗略的沿着我以前设计的程序人生轨迹走了走。

其间也有过失业的落魄,吃不上饭的紧张,我记的最难的时候到CSDN上来发表文章,得到了很多兄弟姐妹的祝福和支持,给了我很大的鼓励,真的谢谢。

我今年28岁,未婚,彻底烦了。为什么?累;没有希望。先说说我的一点感悟。

软件行业分析:
1、开发出售行业适用的单机版软件。
2、开发行业适用的网络版(B/S)软件,一般是大单,几十万到几百万。
3、和行业的政府主管部门合作,推行一些行业方面的应用软件。
补充:做软件一定要做行业软件,才有前途。

这是本人几年来对这个行业的一点分析。

其实第一种情况是软件公司最通常的盈利模式,这种模式软件价格不高,但只要质量站得住脚,可以细水长流,保证公司的成本没问题,做的好还可以盈利不少,但想做大公司很难。

第二种情况,是真正挣钱的情况,接一个大单,什么钱都挣出来了。可以锻炼开发队伍,建立完整的大的开发框架,而且在这个行业里可以造成很大影响,在一个地方实施成功后可以低成本的再推广,占领一片市场。总之一句话可以让一个小公司真正的成长起来。

第三种情况纯粹就是敛财了,和主管部门合作,强行推广软件,绝对的只赚不赔,我想各个地区都有这样的案例,如税务方面的。缺点是这样的公司都受地域性限制,老板钱拿的太舒服,没什么上进心,公司很难做大,不过也成了地方的行业一霸了,也不错。

累,大家都知道就不说了。为什么没有希望呢?因为我发现一个公司真正勤勤恳垦的实干是挣不到大钱的。

真正能挣到大钱的公司完全都是靠老板的个人关系到什么程度,要想在某个行业里成为软件老大,要看你和这个行业里的政府主管部门的关系如何。我看到了太多软件和他们公司的产品,一个字“烂”。

可那赚钱的速度,呵呵。其实赚多少钱,都是老板的,我们打工的不就是拿个死工资吗,我们更多的人不是连个受剥削的机会都找不到吗?每次面试刚从大学出来的计算机的本科生,我真想对他说:你何必要选择这一行?每次面试那些工作经历比我长,年龄比我大程序员,看着他唯唯诺诺的目光,我就想:曾几何时我也像他这样,被人横眉冷对的面试多少次,以后我是不是还会像他这样,再去看人家的脸色啊?心寒啊!
看着同期毕业的同学,都转了行的,在自己的行业里都混的不错,大部分都比自己挣钱多,有干头;就是挣钱少的,他也干的轻松啊,最简单得到就是和自己项目接洽企业或政府的信息部主管或网管,懂的不多,轻轻松松,钱比我们的多,有问题老找我们,面对他犯的低级错误,我们还得笑呵呵。我心里确实不平衡啊。

一句话,不当程序员后悔,当了程序员更后悔。

出路在哪?我在找…

1、从程序员,到系统分析,到项目经理。条件:必须是大公司,工资高,福利好,有完整的发展曲线;个人对软件开发有持续的热情。
2、转行到大型企业,事业单位,政府做信息化方面的工作(可以说是网管)。生活有保障,不必太辛苦。条件:一定的能力,一定的人际关系。
3、考研,考博再深造,出国或留校搞教学,培养一代不如一代的本科生,闲时打着大学的名义做做项目,赚个房钱。条件:高学历,一定的经济基础和家庭背景。
4、创业:这个谈起来大发了。这里只说条件:很好的项目,创业精神,一定的经济基础。
5、共享软件:很多程序员的梦想,自己写个软件全世界的卖,光注册费够一家人生活的了。成功少数,但只要有的都发达了。如ACDsee,优化大师,超级兔子,千千静听(可到共享软件区查询)。但我告诉你,这方面基本是没法干了,写个小东西挣钱玩玩可以,要靠他吃饭,饿死吧。条件:过硬的专门的软件技术,富有创意的头脑。
6、网站:基本情况和共享软件差不太多,只是比共享软件更好干点。但奇迹照样有,可看看hao123的神话和现在很牛的80后的富翁。关键你有没有这个本事和这个命了。
7、行业信息化咨询顾问:随着各个行业信息化的普及,企业对这方面人才需求很大。真正实现信息化的企业都需要这样一个既懂软件,又懂行业知识的人员,他和网管还是有区别的,他的要求更高些,更像一个自由职业者,专家类型的,这样的人放在企业里小的是个主管,大的是个副总。条件:很深的行业内部的技术或管理经验,较强的软件开发或实施经验;通常35岁以上才是成熟人才,因为经验是要经过历练的。其实就是个人物了。
8、转行,彻底的转行。干不下去,精力不够了,脑子不灵了,钱太少。只要你够理由,你就走。从新开始另一段新的生活,有什么了不起的,哪里也饿不死我这个干软件的。

我是哪种人,我说我是第8种人,看看能不能兼第5,6种人。
我大学由于种种原因没毕业,最高学历是高中,呵呵。就学历而讲,能干到我目前这个水平我觉的可以了,是时候激流勇退了。
就职业规划和财富而言,我这几年走的路并不成功,最起码无奈的转行本身就是一种失败。就我的人生而言,我觉的很成功。我了却了自己的一个人生梦想,在短时间内品尝了一个“高科技”行业的酸甜苦辣,技术出身也使我比别人多了一份淡定和从容。现在我可以放下这段旅程,再来一个新的开始。

程序兄弟们别自卑,说到优势我们有很多:

1、聪明的头脑,较高的智商。有人说程序员呆,不会为人处事,只会和机器打交道,没前途没希望。我告诉你,程序员愿意和机器打交道是因为他专注于技术,是职业特点,如果我们程序员的头脑用到一般行业,企业,政府单位里去耍耍阴谋诡计,骗骗人,卖卖产品或套套别人的话,我敢说,他们十个人也玩不过我们一个人。俗一点:就他们那点智商,也就骗骗鬼啊。

2、创新精神,学习能力和频繁的知识更新速度。做软件的都知道,干一行的软件,就得学一行的知识,这一行的知识越丰富,软件才可能写的越好。我们都具备着很好的学习能力,学习新知识,新技术的能力。不敢说每个做过的行业我们多么了解,最起码我们总是站在风头浪尖上,高屋建瓴,问题看得远,想的长(要不你怎么去设计数据库啊,呵呵)。我们能以非专业人士的角度,系统的分析出一个行业某方面的流程,那当我们就做的这个行业时,我们对我们的能力还没有信心吗?

3、扎实的工作态度,未雨绸缪的危机意识。扎实的工作态度是每个合格的程序员都应该具备的,因为我们要对代码负责;谈到危机意识,我想大多数程序员都和我一样吃者碗里的,看着锅里的吧,也是被社会逼的没办法。其实这都成了我们的优点了,以后从事哪个行业,都需要这两点精神。

我要走了,去干个和软件根本不搭边的行业,我去干是因为我是老板之一,而且钱绝对比现在好赚。过年的时候,我有个外甥刚大学毕业,非要做软件,我给他了以下建议,算是为后来者留一点东西:

1、能进大公司就别去小公司,在大公司里你能接受真正正统软件开发教育,比到小公司当个什么啥都干,啥都不精的主管强。

2、不断的学习,注意技术积累和更新,那是你唯一的资本。

3、做软硬件结合方面的开发,单片机的开发,嵌入式系统的开发,比较有前途而且门槛高。但凡基于数据库的开发,不管是.NET平台的,J2EE平台的,VC,DELPHI,PB,VB都是扯淡,其核心价值是开发人员的经验而不是技术本身。因为真正的核心技术都在国外,中国没有,我发现不管那种语言,最好用的类库或组件都是老外写的。

4、要有个好点的学历,别像我一样。毕竟是个高学历的行业,学历低人家都瞧不起你,你的发展也很有限 。30岁之前,可考虑弄个高程,CCNA,数据库管理员之类比较有含金量的证书打扮打扮自己,过了35岁其实意义就不大了

何去何从,我们都有自己的路要走。我转行了,我就不再是程序员了吗,不!我只是不在做为别人打工的职业程序员了,我要做自己的终身程序员。闲来时我会为自己写程序,写我愿意写的。当写程序不再是一种职业而是一种兴趣和热情时,他才会陪伴我一辈子。我还会再来CSDN,做为一个非专业人士,一个轻松的真正的程序员而来。未来的一天,当我老的时候,不管那时我有什么成就,或不名一文,如果别人问起我以前是干什么的,我希望仍能自豪的回答:“我曾经是一名软件工程师”。

转载自:http://cnbeta.com/articles/139515.htm

2011四月1

Android开发:屏幕常亮 PowerManager和PowerManager.WakeLock

前言

  学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的学习研究方向。这里我首先选择了jwood的 Standup Timer 项目。本文将把研究的内容笔记整理,建立一个索引列表。

PowerManager.WakeLock

  PowerManager.WakerLock是我分析Standup Timer源代码时发现的一个小知识点,Standup Timer 用WakeLock保证程序运行时保持手机屏幕的恒亮(程序虽小但也做得相当的细心,考虑的很周到)。PowerManager 和PowerManager.WakerLock7用于对Android设备的电源进行管理。
  PowerManager:This class gives you control of the power state of the device.
  PowerManager.WakeLock: lets you say that you need to have the device on.
  Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现。先上一段Standup Timer里的代码然后进行说明。
private void acquireWakeLock() {
         if (wakeLock == null) {
                Logger.d("Acquiring wake lock");
                PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass().getCanonicalName());
                wakeLock.acquire();
            }

    }

private void releaseWakeLock() {
        if (wakeLock != null && wakeLock.isHeld()) {
            wakeLock.release();
            wakeLock = null;
        }

    }

 

acquireWakeLock()方法中获取了 SCREEN_DIM_WAKE_LOCK锁,该锁使 CPU 保持运转,屏幕保持亮度(可以变灰)。这个函数在Activity的 onResume中被调用。releaseWakeLock()方法则是释放该锁。它在Activity的 onPause中被调用。利用Activiy的生命周期,巧妙的让 acquire()和release()成对出现。

    @Override
    protected void onResume()
    {
        super.onResume();
                //获取锁,保持屏幕亮度
        acquireWakeLock();
        startTimer();
    }
protected void onPause()
    {
        super.onPause();
         synchronized(this) {
                cancelTimer();
                releaseWakeLock();

                if (finished) {
                    clearState();
                } else {
                    saveState();
                }
            }
    }

 

PowerManager和WakeLock的操作步骤
  1.   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);通过 Context.getSystemService().方法获取PowerManager实例。
  2.   然后通过PowerManager的newWakeLock((int flags, String tag)来生成WakeLock实例。int Flags指示要获取哪种WakeLock,不同的Lock对cpu 、屏幕、键盘灯有不同影响。
  3.   获取WakeLock实例后通过acquire()获取相应的锁,然后进行其他业务逻辑的操作,最后使用release()释放(释放是必须的)。

关于int flags

  各种锁的类型对CPU 、屏幕、键盘的影响:

PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。

SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯

SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,允许保持屏幕高亮显示,允许关闭键盘灯

FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度

ACQUIRE_CAUSES_WAKEUP:Normal wake locks don’t actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.

ON_AFTER_RELEASE:f this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to reduce flicker if you are cycling between wake lock conditions.

权限获取

要进行电源的操作需要在AndroidManifest.xml中声明该应用有设置电源管理的权限。
<uses-permission android:name="android.permission.WAKE_LOCK" /> 你可能还需要 <uses-permission android:name="android.permission.DEVICE_POWER" />

另外WakeLock的设置是 Activiy 级别的,不是针对整个Application应用的。

 

摘自:http://fanwei51880.blog.163.com/blog/static/324067402010108105416798/

2011三月10

MySQL 数据库引擎InnoDB转换成MyISAM

1、备份数据库

为了安全,我采用了2个备份语句分别备份带表信息的sql和不带表信息的sql:

A:mysqldump -h localhost -uroot -ppass -R  mydb> F:\dbbak\mydb%DATE:~0,10%.2.sql  (默认utf8格式)

B:mysqldump -h localhost -uroot -ppass -R –default-character-set=gbk –compatible=No_table_options mydb> F:\dbbak\mydb%DATE:~0,10%.2.sql

2、修改MySQL 默认引擎

因为上述,备份的SQL语句中不包含表信息,还原数据库的时候采用默认引擎,即:

default-storage-engine=MyISAM

数据字段比较大的话,要添加

max_allowed_packet = 300M

3、执行MySQL还原数据库命令

C:>mysql -uroot -ppassword –default-character-set=gbk

mysql>create databse mydb;
mysql>use mydb;
mysql>source mydb.sql;

2011三月2

囧,升级 WordPress 3.1 导致网站不能访问

昨天升级之后就放着没管,也没去前台看看,谁知道不能访问了,额,一天时间。。

解决方法:
修改 wp-include/template-loader.php 文件,把下面两段话注释。

//if ( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )
// do_action(‘template_redirect’);

2011一月26

Android 开发:TextView 文字阴影效果

res/values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AudioFileInfoOverlayText">
    <item name="android:paddingLeft">4px</item>
    <item name="android:paddingBottom">4px</item>
    <item name="android:textColor">#f1f1f1</item>
    <item name="android:textSize">60sp</item>
    <item name="android:shadowColor">#4d4d4d</item>
    <item name="android:shadowDx">0</item>
    <item name="android:shadowDy">-3</item>
    <item name="android:shadowRadius">3</item>
</style>
</resources>

res/layout/main.xml

<TextView style="@style/AudioFileInfoOverlayText" 
        android:id="@+id/title"
		android:layout_gravity="bottom"
		android:gravity="center_vertical|center_horizontal"
		android:layout_width="640px" android:layout_height="151px"
		android:background="@drawable/compass_bottom"
		></TextView>