Android工作总结(必备20篇)

时间:2021-07-31 作者:好拿网

⬗ Android工作总结 ⬗

当系统检测到一个NFC标签的时候,他会自动去寻找最合适的activity去处理这个intent.

NFC发出的这个Intent将会有三种action:

ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。

ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便你的tag中所包含的数据是NDEF的,但是如果这个数据的MIMEtype或URI不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.

ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的TAG类型的

首先是权限:

例如:

NfcAdapter mAdapter = NfcAdapter.getDefaultAdapter(this);

接着是特殊功能限制:

这个生命可以让你的应用在googleplay上被声明使用者必须拥有nfc功能。

在activity的intent过滤xml声明中,你可以同时声明过滤这三种action.但是由之前所说,你应该知道系统在发送intent的时候是有优先级的,所以你最好清楚自己最想处理哪个。

1:过滤ACTION_TAG_DISCOVERED:

这个最简单,也是最后一个被尝试接受intent的选项。

2:过滤ACTION_NDEF_DISCOVERED:

其中最重要的应该算是data的mimeType类型了,这个定义的越准确,intent指向你这个activity的成功率就越高,否则系统可能不会发出你想要的NDEF intent了。下面在讲如何使用NDEF写入NFC标签的时候会多举几个类型的例子。

3:过滤ACTION_TECH_DISCOVERED:

/res/xml下面创建一个过滤规则文件。名字任取,比如可以叫做nfc_tech_filter.xml。这个里面定义的是nfc实现的各种标准,每一个nfc卡都会符合多个不同的标准,个人理解为这些标准有些相互之间也是兼容的。你可以在检测到nfc标签后使用getTechList()方法来查看你所检测的tag到底支持哪些nfc标准。

一个nfc_tech_filter.xml中可以定义多个结构组。

android..IsoDepandroid..NfcAandroid..NfcBandroid..NfcFandroid..NfcVandroid..Ndefandroid..NdefFormatableandroid..MifareClassicandroid..MifareUltralight

在androidManifest文件中声明xml过滤的举例如下:

package o.Beam;import java.io.ByteArrayOutputStream;import java.nio.charset.Charset;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.Locale;import org.nfc.read.ParsedNdefRecord;import android.app.Activity;import android.app.AlertDialog;import android.app.PendingIntent;import ntent.DialogInterface;import ntent.Intent;import android.nfc.NdefMessage;import android.nfc.NdefRecord;import android.nfc.NfcAdapter;import android.nfc.Tag;import android..MifareClassic;import android..MifareUltralight;import android.os.Bundle;import android.os.Parcelable;import vider.Settings;import android.widget.TextView;public class MainActivity extends Activity { private static final DateFormat TIME_FORMAT = SimpleDateFormat .getDateTimeInstance(); private NfcAdapter mAdapter; private PendingIntent mPendingIntent; private NdefMessage mNdefPushMessage; private TextView promt; private AlertDialog mDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); promt = (TextView) findViewById(R.mt); resolveIntent(getIntent()); mDialog = new AlertDialog.Builder(this).setNeutralButton(“Ok”, null) .create(); // 获取默认的NFC控制器 mAdapter = NfcAdapter.getDefaultAdapter(this); //拦截系统级的NFC扫描,例如扫描蓝牙 mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); mNdefPushMessage = new NdefMessage(new NdefRecord { newTextRecord(“”, Locale.ENGLISH, true) }); } @Override protected void onResume() { super.onResume(); if (mAdapter == null) { if (!mAdapter.isEnabled()) { showWirelessSettingsDialog(); } showMessage(R.string.error, R.string.no_nfc); promt.setText(“设备不支持NFC!”); return; } if (!mAdapter.isEnabled()) { promt.setText(“请在系统设置中先启用NFC功能!”); return; } if (mAdapter != null) { //隐式启动 mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); mAdapter.enableForegroundNdefPush(this, mNdefPushMessage); } } @Override protected void onPause() { super.onPause(); if (mAdapter != null) { //隐式启动 mAdapter.disableForegroundDispatch(this); mAdapter.disableForegroundNdefPush(this); } } //16进制字符串转换为String private String hexString = “0123456789ABCDEF”; public String decode(String bytes) { if (bytes.length() != 30) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream( bytes.length() / 2); // 将每2位16进制整数组装成一个字节 for (int i = 0; i < bytes.length(); i += 2) baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString .indexOf(bytes.charAt(i + 1)))); return new String(baos.toByteArray()); } // 字符序列转换为16进制字符串 private static String bytesToHexString(byte src, boolean isPrefix) { StringBuilder stringBuilder = new StringBuilder(); if (isPrefix == true) { stringBuilder.append(“0x”); } if (src == null || src.length <= 0) { return null; } char buffer = new char; for (int i = 0; i < src.length; i++) { buffer = Character.toUpperCase(Character.forDigit( (src >>>4) & 0x0F, 16)); buffer = Character.toUpperCase(Character.forDigit(src & 0x0F, 16)); System.out.println(buffer); stringBuilder.append(buffer); } return stringBuilder.toString(); } private void showMessage(int title, int message) { mDialog.setTitle(title); mDialog.setMessage(getText(message)); (); } private NdefRecord newTextRecord(String text, Locale locale, boolean encodeInUtf8) { byte langBytes = locale.getLanguage().getBytes( Charset.forName(“US-ASCII”)); Charset utfEncoding = encodeInUtf8 ? Charset.forName(“UTF-8”) : Charset .forName(“UTF-16”); byte textBytes = text.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte data = new byte; data = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte, data); } private void showWirelessSettingsDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.nfc_disabled); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) {Intent intent = new Intent( Settings.ACTION_WIRELESS_SETTINGS);startActivity(intent); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) {finish(); } }); builder.create().show(); return; } //初步判断是什么类型NFC卡 private void resolveIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable rawMsgs = intent .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msgs; if (rawMsgs != null) { msgs = new NdefMessage; for (int i = 0; i < rawMsgs.length; i++) { msgs = (NdefMessage) rawMsgs; } } else { // Unknown tag type byte empty = new byte; byte id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); byte payload = dumpTagData(tag).getBytes(); NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN,empty, id, payload); NdefMessage msg = new NdefMessage(new NdefRecord { record }); msgs = new NdefMessage { msg }; } // Setup the views buildTagViews(msgs); } } //一般公家卡,扫描的信息 private String dumpTagData(Parcelable p) { StringBuilder sb = new StringBuilder(); Tag tag = (Tag) p; byte id = tag.getId(); sb.append(“Tag ID (hex): ”).append(getHex(id)).append(“\n”); sb.append(“Tag ID (dec): ”).append(getDec(id)).append(“\n”); sb.append(“ID (reversed): ”).append(getReversed(id)).append(“\n”); String prefix = “android..”; sb.append(“Technologies: ”); for (String tech : tag.getTechList()) { sb.append(tech.substring(prefix.length())); sb.append(“, ”); } sb.delete(sb.length() - 2, sb.length()); for (String tech : tag.getTechList()) { if (tech.equals(MifareClassic.class.getName())) { sb.append('\n'); MifareClassic mifareTag = MifareClassic.get(tag); String type = “Unknown”; switch (mifareTag.getType()) { case MifareClassic.TYPE_CLASSIC: type = “Classic”; break; case MifareClassic.TYPE_PLUS: type = “Plus”; break; case MifareClassic.TYPE_PRO: type = “Pro”; break; } sb.append(“Mifare Classic type: ”); sb.append(type); sb.append('\n'); sb.append(“Mifare size: ”); sb.append(mifareTag.getSize() + “ bytes”); sb.append('\n'); sb.append(“Mifare sectors: ”); sb.append(mifareTag.getSectorCount()); sb.append('\n'); sb.append(“Mifare blocks: ”); sb.append(mifareTag.getBlockCount()); } if (tech.equals(MifareUltralight.class.getName())) { sb.append('\n'); MifareUltralight mifareUlTag = MifareUltralight.get(tag); String type = “Unknown”; switch (mifareUlTag.getType()) { case MifareUltralight.TYPE_ULTRALIGHT: type = “Ultralight”; break; case MifareUltralight.TYPE_ULTRALIGHT_C: type = “Ultralight C”; break; } sb.append(“Mifare Ultralight type: ”); sb.append(type); } } return sb.toString(); } private String getHex(byte bytes) { StringBuilder sb = new StringBuilder(); for (int i = bytes.length - 1; i >= 0; --i) { int b = bytes & 0xff; if (b < 0x10) sb.append('0'); sb.append(Integer.toHexString(b)); if (i >0) { sb.append(“ ”); } } return sb.toString(); } private long getDec(byte bytes) { long result = 0; long factor = 1; for (int i = 0; i < bytes.length; ++i) { long value = bytes & 0xffl; result += value * factor; factor *= 256l; } return result; } private long getReversed(byte bytes) { long result = 0; long factor = 1; for (int i = bytes.length - 1; i >= 0; --i) { long value = bytes & 0xffl; result += value * factor; factor *= 256l; } return result; } //显示NFC扫描的数据 private void buildTagViews(NdefMessage msgs) { if (msgs == null || msgs.length == 0) { return; } // Parse the first message in the list // Build views for all of the sub records Date now = new Date(); List

records = NdefMessageParser.parse(msgs); final int size = records.size(); for (int i = 0; i < size; i++) { TextView timeView = new TextView(this); timeView.setText(TIME_FORMAT.format(now)); ParsedNdefRecord record = records.get(i); promt.append(record.getViewText()); } } //获取系统隐式启动的 @Override public void onNewIntent(Intent intent) { setIntent(intent); resolveIntent(intent); }}

2、androidManifest配置

⬗ Android工作总结 ⬗

在Escips进行编译仿真时,如果有错误 logcat会出很多行红字,怎样从红字中获取有用信息

一般的话红字第一行,就能说明错误原因。还有个笨方法是 挨行双击。

一般的错误都会显示在第二行红字里面,你选中后点击右键

选择“Filter similar meages...”,就可以查看复制出log的信息,然后上网搜搜什么的都可以。

一般出错的类,以及什么异常都会显示出来。一个简单的办法就是你浏览出错信息,找到你自己认识(或者说你自己写的)的类和方法,后面有标识的错误的代码行号。

Fatal adj [/fetl]致命的的,重大的,毁灭性的()的参数问题(2011-10-11 10:54:39)转载▼ 标签: 杂谈

有关,在创建时一定要用this做为参数,如:new (this);有些时候用this 会出现错误,因为dialog不是在oncreate中定义的。不妨在MainActivity建立类

public static MainActivity mainactivity; 然后在oncreate中mainactivity = this; 之后建立Dialog new ();个人试过可以,大家不妨尝试

new (this)跟new ()(A是外部类名)的区别是什么呢?实现过程中的结果有什么区别呢??能详细说明吗?谢谢。。

分享到:

2011-11-04 19:54提问者采纳

首先(this)所传参数类型是contex,也就是上下文环境。this意思是当前对象,就是调用()的对象。所以,前者的this是临近最外面的那个cla产生的对象

后者是cla A产生的对象。明白了吗?

追问

this意思是当前对象,就是调用()的对象。所以,前者的this是最外面的那个cla产生的对象 关于这句可以再详细一点说明吗。。谢谢

回答

举个例子吧:

public cla A {

//一个有名内部类

cla B{ fun(this);//这里的this是类B产生的对象

Fun();//这里的this是类A产生的对象

} } public void onClick(View v)是什么意思? View类的对象v作为参数传入onClick函数,至于View具体是什么类需要根据实际情况来看。

手机音效

Android手机的来电铃声和短信铃声的设置虽然也有些繁琐,但是细心的用户仔细摸索一下就能会快知道了。但是android手机还有按键声音和照相声音,这些都是一成不变的,时间一长,大家也难免会觉得有些厌烦,很多机友都想知道如何来更换这些系统声音,让自己的手机更加个性化。下面就简单的教大家在手机上如何更换这些系统声音。一起往下看。

首先还是需要一些工具软件,前期需要准备的文件和工具有root explorer文件管理器和ogg格式简短音频文件。

explorer(文件管理器)下载: "");//此处指定系统自带浏览器包名和Activity名称.Unable to start activity ComponentInfo:

分类: Android2012-07-20 13:12 561人阅读 评论(0)收藏 举报

Unable to start activity ComponentInfo{....}: 原因:未对控件初始化

Android开发中,空构造Intent和带参数的intent 2012-03-02 14:13wushu | 分类:JAVA相关 | 浏览1884次

代码1:

Intent intent = new Intent();

代码2: (_CALL);(("TEL:110"));startActivity(intent);Intent intent=new Intent(_CALL,("tel:110"));startActivity(intent);两个代码有什么不一样??为什么代码1提示No Activity found to handle Intent,而代码2能正常运行???

分享到:

2012-03-02 15:35提问者采纳

呃。。第二行和第三行换换位置。。

Intent intent = new Intent();(("TEL:110"));(_CALL);startActivity(intent);提问者评价

其实代码2出错的地方是那个tel:110,把tel改成TEL就可以了。

注意字母大写

⬗ Android工作总结 ⬗

三个月的实习即将结束了,感谢公司给我提供这个平台,感谢同事的帮助与关怀,让我学到了很多在课堂上学不到的知识。下面我将从以下几个方面总结这段时间自己的感受。

一、努力学习,注重实践,不断提高自身素养和工作能力

始终把学习作为获得新知、掌握方法、提高能力、解决问题的一条重要途径和方法,切实做到用理论武装头脑、指导实践、推动工作。思想上积极进取,积极的把自己现有的知识用于社会实践中,在实践中也才能检验知识的有用性。

所以在这一个月的实习工作中给我最大的感触就是我们在学校学到了很多的理论知识,但很少用于社会实践中,这样理论和实践就大大的脱节了,以至于在以后的学习和生活中找不到方向。同时在工作中不断的学习也是弥补自己的不足的有效方式。社会在变化,人也在变化,所以你一天不学习,你就会落后。

通过这三个月的实习,并结合吉凤街道的实际情况,认真学习园区的各项政策制度、管理制度和工作条例,使工作中的困难有了最有力地解决武器。通过这些工作条例的学习使我进一步加深了对各项工作的理解,可以求真务实的开展各项工作。

二、围绕中心,突出重点,尽心尽力履行职责

在各项工作中我都本着认真负责的态度去对待每项工作。虽然开始由于经验不足和认识不够,觉得在执法大队找不到事情做,不能得到锻炼的目的,但我迅速从自身出发寻找原因,和同事交流,认识到自己的不足,以至于迅速的转变自己的角色。

为使自己尽快熟悉工作,进入角色,我一方面抓紧时间查看相关资料,熟悉自己的工作职责,另一方面我虚心向街道的领导、同事请教使自己对园区、街道的情况有了一个比较全面、系统的认识和了解。

三、以极大的热情投入到工作中

刚步入工作岗位我难以适应角色的转变,不能发现问题,从而解决问题,认为没有多少事情可以做,我就有一点失望,开始的热情有点消退,完全找不到方向。

但我还是尽量保持当初的那份热情,想干有用的事的态度,不断的做好一些杂事,同时也勇于协助同事做好各项工作,慢慢的就找到了自己的角色,明白自己该干什么,这就是一个热情的问题,只要我保持极大的热情,相信自己一定会得到认可,没有不会做,没有做不好,只有你愿不愿意做。

四、在较好完成本职工作的同时积极帮助公司其他同事

自从进入执法大队以后,我一方面努力做好自己的本职工作,另一方面积极配合吉凤街道办事处同事们的工作,在同事们工作忙碌的时候主动帮助,尽自己最大的能力为同事们分忧解难。

五、存在的问题

几个月来,我虽然努力做了一些工作,但距离办事处领导的要求还有不小差距,如理论水平、工作能力上还有待进一步提高,对新的工作岗位还不够熟悉等等,这些问题,我决心在今后的工作和学习中努力加以改进和解决,使自己更好地做好本职。

在即将到来的20XX年里,我要改掉不足,弥补我的过错,做好工作计划,在工作中学习,为公司创造更大的财富。

1.毕业实习的总结报告

2.个人实习总结报告

3.新闻专业实习总结报告

4.2009暑假实习总结报告

5.新闻系实习总结报告

6.毕业设计实习总结报告

7.精选教育实习个人总结报告

8.顶岗实习总结报告

9.大四实习总结报告

10.电视台实习总结报告

⬗ Android工作总结 ⬗

成为高级工程师就没有太具体了,就是把中级工程师的那几个建议,每个都做的很好,这个阶段往往需要1-2年或者更多。高级工程师的要求是:熟练掌握android api,理解android的内部运行机制,对view、activity等一些常用的android内部运行机制熟练掌握,对常见的android知识点都有涉猎,并且还能够解决一些比较偏门的问题(需要基于android的内部机制),对android的性能调优和适配有认识,代码风格较好并且具有一定的设计模式,在工作上除了技术还要有业务的理解,能够指导初中级工程师,在工作中能够独挡一面。同时在解决问题的能力上达到一个全新的档次,即能够用恰当的手段去解决无法google出来的问题的答案。这个解决问题的能力的档次,这个有点抽象,但是的确很重要,它决定了一个人的档次,具体的需要大家慢慢体会,当技术达到一个档次后,你就可以轻松解决一些疑难杂症。

关于整个周期,从初级到高级大概要2-3年,或者更久。这么说,业余时间利用的越充分,这个周期就会越短,你的个人价值就会越高。虽然说起来简单,但是努力的过程是很艰辛的,但是只要你坚持去努力,很快你的生活就会不一样,相信这一点,谁都知道要努力才能有所收获,但为什么还是好多人没收获呢,原因是努力是不容易的,是要花时间的,是比看电影玩游戏要痛苦很多的。不怕别人比我们聪明,就怕比我们聪明的人还比我们努力。好了,大家加油了,花的时间到了,高级工程师自然就有了。最后,再强调下努力的重要性,在一个公司里,周围人的水平都和我们差不多,要深知脱颖而出的困难程度,从那么多人中脱颖而出是很难的。因此,一定要努力,一定要逼着自己去学习,这样才有可能脱颖而出,请大家一定要有这个意识。

⬗ Android工作总结 ⬗

1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?

FLAG_ACTIVITY_SINGLE_TOP如果目标Activity已经运行在栈顶,将不会再启动

= singleTop

FLAG_ACTIVITY_BROUGHT_TO_FRONT 、=singleTask

FLAG_ACTIVITY_MULTIPLE_TASK=singleInstance

FLAG_ACTIVITY_CLEAR_TOP、如果被启动的activity已经运行在当前 task,将不会再创建新的活动实例,位于其上的其它activity将会被关闭。

2. Activity和Task的启动模式有哪些? 每种含义是什么?

3. 通过Intent传递一些二进制数据的方法有哪些?

1). 使用Serializable接口实现序列化,这是Java常用的方法。

2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同

时Parcelable在Android AIDL中交换数据也很常见的。

4. 能说下Android应用的入口点吗?

真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。

5. Android都有哪些XML解析器,都熟练掌握吗?

这里SAX和DOM、XmlPull相信做过Web开发的都已经滚瓜烂熟了。

6. SQLite支持事务吗? 添加删除如何提高性能?

SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过优化的SQL查询语句方式处理。SQLITE默认就是打开事务的。

7. Android Service和Binder、AIDL你都熟练吗?

Binder是系统进程间通信(IPC)方式之一。Binder使用Client-Server通信方式:一个进程作为Server提供诸如视频/音频解码,视频捕获,地址本查询,网络连接等服务;多个进程作为Client向Server发起服务请求,获得所需要的服务。要想实现Client-Server通信据必须实现以下两点:一是server 必须有确定的访问接入点或者说地址来接受Client的请求,并且Client可以通过某种途径获知Server的地址;二是制定Command- Reply协议来传输数据。例如在网络通信中Server的访问接入点就是Server主机的IP地址+端口号,传输协议为TCP协议。对Binder而言,Binder可以看成Server提供的实现某个特定服务的访问接入点, Client通过这个‘地址’向Server发送请求来使用该服务;对Client而言,Binder可以看成是通向Server的管道入口,要想和某个 Server通信首先必须建立这个管道并获得管道入口。Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及驱动。其中 Server,Client,SMgr运行于用户空间,驱动运行于内核空间。由于Android的Java层级只是一个外壳框架而已,大部分的系统组件(Android本身)都是在Nataive层(又称C/C++层)执行。这是Android的整体架构,所以我们的应用程序也必须考虑分为两层的必要性,才能完全的融入Android的整体架构里。我们看到的Android应用架构(Application Framework)其实只是Android整体架构里的外壳结构而已。Android应用框架就如同椅子的椅面,那么椅子的椅腿在哪里呢?Binder系统是在Native层的C/C++组件。Java应用程序(如Activity体系等)是透过JNI界面去呼叫Binder系统(或称为组件)。

AIDL:在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的`. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.

AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象. AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

8. 你用过哪款Android手机,有哪些优点和不足,相对于iPhone或Symbian又有哪些优缺点?

⬗ Android工作总结 ⬗

先有伯乐,才有千里马。人是可以被教育的,前提是,你的伯乐在哪里?他是谁?他能让你成为谁?贵人是教育你建立正确思维、正确价值观、正确人生理念的人,贵人是给你理顺思路的人,是给你明确方向的人,是修正你的人、是恨铁不成钢又处处说你优点的人,是鼓励和帮助你的人,是恨你到咬牙切齿又不忍心放弃你的人,是把你扶上马送你一程的人,是陪你到胜利为你呐喊欢呼的人!千锋广州Android培训班的就业老师告诉我们,学员就业后,很多会受益于公司里带团队的“师傅”,能够遇到帮助到自己的贵人,那将会受益良多。

选择比努力更重要

人骑上自行车,两脚使劲踩1小时只能跑10公里左右;人开上汽车,一脚轻踏油门1小时能够跑100公里左右;人坐上动车,闭上眼睛1小时也能跑300公里;人登上飞机,吃着美味1小时居然跑1000公里!人还是那个人,平台不一样,载体不一样,结果就不一样了!所以选择比努力更重要。对于选择Android培训的学生来说,同样选择一个培训平台也至关重要,千锋广州Android培训的老师建议学生来校实地考察后,再慎重选择自己想去的机构,不要盲目跟从!

⬗ Android工作总结 ⬗

…Android面试题

1. 下列哪些语句关于内存回收的说明是正确的? (b )

A、 程序员必须创建一个线程来释放内存 B、 内存回收程序负责释放无用内存 C、 内存回收程序允许程序员直接释放内存 D、 内存回收程序可以在指定的时间释放内存对象

2. 下面异常是属于Runtime Exception 的是(abcd)(多选)

A、ArithmeticException B、IllegalArgumentException C、NullPointerException D、BufferUnderflowException

3. Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). c

A、12 ,-12

4. 下列程序段的输出结果是:(b )

void complicatedexpression_r(){ int x=20, y=30; boolean b;

b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60; System.out.println(b); }

A、true B、false C、011.activity

5. 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)

A、onPause() B、onCreate() C、 onResume() D、onStart()

6. Intent传递数据时,下列的数据类型哪些可以被传递(abcd)(多选)

A、Serializable B、charsequence C、Parcelable D、Bundle

7. android 中下列属于Intent的作用的是(c)

A、实现应用程序间的数据共享

B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失

C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作

8. 下列属于SAX解析xml文件的优点的是(b)

A、将整个文档树在内存中,便于操作,支持删除,修改,重新排列等多种功能 B、不用事先调入整个文档,占用资源少

C、整个文档调入内存,浪费时间和空间

D、不是长久驻留在内存,数据不是持久的,事件过后,若没有保存数据,数据就会

消失

9. 下面的对自定style的方式正确的.是(a)

A、


B、

C、fill_parent


D、


10. 在android中使用Menu时可能需要重写的方法有(ac)。(多选)

A、onCreateOptionsMenu()

B、onCreateMenu() C、onOptionsItemSelected() D、onItemSelected()

11. 在SQL Server Management Studio 中运行下列T-SQL语句,其输出值(c)。

SELECT @@IDENTITY A、 可能为 可能为 不可能为-

肯定为0

12. 在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询

之 后的结果是(d)。

BEGIN TRANSACTION A

Update SALES Set qty=SALES表中qty列最小值大于等于SALES表中qty列最小值大于等于SALES表中qty列的数据全部为SALES表中qty列最小值大于等于60

13. 在android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以

对数据库版本进行管理的方法可以是(ab)

A、getWriteableDatabase()

B、getReadableDatabase()

C、getDatabase() D、getAbleDatabase()

14. android 关于service生命周期的onCreate()和onStart()说法正确的是(ad)(多选题)

A、当第一次启动的时候先后调用onCreate()和onStart()方法 B、当第一次启动的时候只会调用onCreate()方法

C、如果service已经启动,将先后调用onCreate()和onStart()方法

D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法

15. 下面是属于GLSurFaceView特性的是(abc)(多选)

A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图 view上。

B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。 C、让渲染器在独立的线程里运作,和UI线程分离。 D、可以直接从内存或者DMA等硬件接口取得图像数据

16. 下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确的(a)

A、

android:name="vider.action.NewBroad"/>B、

android:name="vider.action.NewBroad"/> C、

android:name="vider.action.NewBroad"/>D、

android:name="vider.action.NewBroad"/>

17. 关于ContenValues类说法正确的是(a)

A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是String类型,而值都是基本类型

B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是任意类型,而值都是基本类型

C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名,可以为空,而值都是String类型

D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中 的名是String类型,而值也是String类型

18. 我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会

变得越慢,那么线程销毁的方法是(a)

A、onDestroy() B、onClear() C、onFinish() D、onStop()

19. 下面退出Activity错误的方法是(c)

A、finish()

B、抛异常强制退出

C、System.exit() D、onStop()

20. 下面属于android的动画分类的有(ab)(多项)

A、Tween B、Frame C、Draw D、Animation

21. 下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是(d)

A、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定

拥有一个独立 的Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念.

B、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一

定拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux 中的一个进程,所以说不是一个概念.

C、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux 中的一个进程,所以说不是一个概念.

D、DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念.

22. Android项目工程下面的assets目录的作用是什么b

A、放置应用到的图片资源。 B、主要放置多媒体等数据文件 C、放置字符串,颜色,数组等常量数据

D、放置一些与UI相应的布局文件,都是xml文件

23. 关于res/raw目录说法正确的是(a)

A、 这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B、 这里的文件是原封不动的存储到设备上会转换为二进制的格式 C、 这里的文件最终以二进制的格式存储到指定的包中 D、 这里的文件最终不会以二进制的格式存储到指定的包中

⬗ Android工作总结 ⬗

简历是用来求职的,招聘者需要找的人才,所以你要把我的优点重点的突出显示,要招聘者拿到你的简历就马上见到这一些优点,招聘者查看简历时间是有限的,如果在这10多秒时间内不能打动他,那你的简历可能就会被扔掉的了。所以你要做到的就是把重点的.内容放在第一页,并利用加粗或下划线等能让人注意的标记,适当的提示。

制作个人简历,最忌的就是搞了一份很厚多内容,页数很多的简历。正如上面所说,招聘者看简历时间有限,所以你的简历也一定要精简,第一就是页数上的精简,像简历封面、自荐信、学校介绍、专业介绍等及一些证书的复印件都不需要提供了。第二就是内容上也要精简,用简短有力的语句表达出重点的内容。其实招聘都最关心的问题,你会做什么?做过什么?有怎样的成绩,最后就会得出一个结论,你是否适合。

应聘职位: 计算机软件:ERP/SAP系统工程师、软件工程师:Windows Mobile,Android,J2ME开发、嵌入式软件开发(Linux/单片机/DLC/DSP…):

月薪要求: 5000--8000 希望工作地区: 广东省 北京 上海

工作描述: 负责企业ERP/SAP,MRP2,HR管理系统的开发与实施工作,多次带领开发团队深入企业,参与多家企业的ERP/SAP系统的设计与项目实施,成功完成了电子、服装等十多个行业公司企业的ERP/SAP系统的开发与实施任务。

离职原因:

工作描述: 负责软件,网络计算机相关课程讲授,带领学生进行进行课程实验。

离职原因:

公司名称: 起止年月:-01 ~ 2004-01广州艾斯顿有限公司

工作描述: 负责公司的电脑维护,网站维护,软件开发工作。

1992-09 -07 湖南常德机电工程学校(湖南常德职业技术学院) 机械电子 毕业证

1996-09 1999-07 湖南常德电脑大学 计算机信息管理 毕业证

1.精通Windows Mobile,WinCe手机系统软件开发,熟悉Android,J2Me系统设计。

2.精通C/C++VB/VC++,C++Builder/ABAP, EVC/WIN CE, SQL SERVER等编程语言, 有丰富的ERP/MRP/OA系统开发与实施经验,精通酒店信息管理系统的开发与维护,为多家企业成功设计开发了ERP/SAP系统软件和一百多家五星级酒店管理系统,赢得了客户广泛的好评。

2.熟识思科、华为等网络设备的安装与调试维护工作,精通RFID、嵌入式系统程序设计、嵌入式/上位机编程。

精通Windows Mobile,WinCe手机系统软件开发,熟悉Android,J2Me系统设计,精通C/C++VB/VC++,C++Builder /SAP(ABAP), EVC/WIN CE,RFID、SQL SERVER等编程语言, 熟悉思科、华为等网络设备的安装与调试维护工作,为多家企业成功设计开发、完成实施ERP/SAP系统软件和一百多家五星级酒店管理系统,赢得了客户广泛的好评。

⬗ Android工作总结 ⬗

1、 Android的四大组件是哪些,它们的作用?

答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口

Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径

Broadcast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

2、 请介绍下Android中常用的五种布局。

常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。

一、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。二、LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局(android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。四、RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、 android:layout_toLeftOf相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。

3、 android中的动画有哪几类,它们的特点和区别是什么

答:两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

4、 android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别。

答:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存中去,该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。

5、 ListView的优化方案

答:1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。

2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。

3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。

6、 请介绍下Android的数据存储方式。

答:使用SharedPreferences存储数据;文件存储数据;SQLite数据库存储数据;使用ContentProvider存储数据;网络存储数据;

Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。

一:使用SharedPreferences存储数据

首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:

void ReadSharedPreferences(){

String strName,strPassword;

SharedPreferences user = getSharedPreferences(“user_info”,0);

strName = user.getString(“NAME”,””);

strPassword = user getString(“PASSWORD”,””);

}

void WriteSharedPreferences(String strName,String strPassword){

SharedPreferences user = getSharedPreferences(“user_info”,0);

uer.edit();

user.putString(“NAME”, strName);

user.putString(“PASSWORD” ,strPassword);

mit();

}

数据读取与写入的方法都非常简单,只是在写入的`时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。

二:文件存储数据

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。具体实例如下:

String fn = “moandroid.log”;

FileInputStream fis = openFileInput(fn);

FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

三:网络存储数据

网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。

四:ContentProvider

1、ContentProvider简介

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

2、Uri类简介

Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://…

2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作contact表中id为10的记录,可以构建这样的路径:/contact/10

要操作contact表中id为10的记录的name字段, contact/10/name

要操作contact表中的所有记录,可以构建这样的路径:/contact?

要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.ntactprovider/contact")

ContentUrist和ContentResolver简介

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从 Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher:用于匹配Uri,它的用法如下:

1.首先把你需要匹配Uri路径全部给注册上,如下:

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://com.changcheng.ntactprovider /contact路径,返回匹配码为1

uriMatcher.addURI(“com.changcheng.ntactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

//如果match()方法匹配 content://com.changcheng.ntactprovider/contact/230路径,返回匹配码为2

uriMatcher.addURI(“com.changcheng.ntactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.ntactprovider/contact路径,返回的匹配码为1。

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较

⬗ Android工作总结 ⬗

现在你是初级工程师,但是你想当个高级工程师,所以,你就要给自己定个目标,即:我是要成为高级工程师的男人。有了这个定位,并且努力朝着这个目标去努力,然后内心深处就会有一个感觉,这个感觉就会成为你的B格。也就是说,虽然我现在是小菜,但是我不是一般的小菜,从而内心有一种自豪感,而这种自豪感会给你提供正能量。这一条是虚的,但是是有用的。

首先找本android入门的书来看,市面上大部分书都是入门的书,要把基本的东西搞懂,在学习的工程中要顺带写点demo。需要注意的是,demo要自己写,哪怕照着书上的抄,也不能直接把书中的demo运行一下。这个是有很大的区别的,代码感觉必须要通过敲代码来培养,抄一遍代码和运行一遍demo效果是截然不同的,这点一定要注意。入门的书看完后,基本就可以上手做一些开发了,比如公司的一些项目啥的。到此,我们已经成为初级工程师了,这个时间一般1-3个月即可。

⬗ Android工作总结 ⬗

AsyncTask的基本用法这里就不在赘述了,是个安卓开发者就会,

private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final it KEEP_ALIVE = 10; …… private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);

在这里我们又看到了ThreadPoolExecutor,它的原理我已经在上一篇介绍过了blog.itachi85/article/details/44874511。

在这里同一时刻能够运行的线程数为5个,线程池总大小为128,当线程数大于核心时,终止前多余的空闲线程等待新任务的最长时间为10秒。在3.0之前的AsyncTask可以同时有5个任务在执行,而3.0之后的AsyncTask同时只能有1个任务在执行。

2.让我们来看看android 4.3版本的 AsyncTask

AsyncTask构造函数:

/** * Creates a new asynchronous task. This constructor must be invoked on the UI thread. */ public AsyncTask() { mWorker = new WorkerRunnable

() {public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked return postResult(doInBackground(mParams));} }; mFuture = new FutureTask(mWorker) {@Overrideprotected void done() { try { postResultIfNotInvoked(get()); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException(An error occured while executing doInBackground(), e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); }} }; }

这段代码初始化了两个变量,mWorker和mFuture,并在初始化mFuture的时候将mWorker作为参数传入。mWorker是一个Callable对象,mFuture是一个FutureTask对象,这两个变量会暂时保存在内存中,稍后才会用到它们。

我们要运用AsyncTask时,大多时候会调用execute()方法,来看看execute()的源码:

execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params);}

返回了executeOnExecutor并传进去sDefaultExecutor(默认的线程池)。先看看executeOnExecutor的源码:

executeOnExecutor(Executor exec,Params... params) { if (mStatus != Status.PENDING) {switch (mStatus) { case RUNNING: throw new IllegalStateException(Cannot execute task: + the task is already running.); case FINISHED: throw new IllegalStateException(Cannot execute task: + the task has already been executed + (a task can be executed only once));} } mStatus = NING; onPreExecute(); mWorker.mParams = params; exec.execute(mFuture); return this; }

传入的线程池exec调用了execute方法并将上文提到的mFuture传了进去。

这个传进来的线程池sDefaultExecutor就是默认的线程池SerialExecutor也就是调用了SerialExecutor的execute()方法:

public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

SerialExecutor的源码:

private static class SerialExecutor implements Executor { final ArrayDequemTasks = new ArrayDeque(); Runnable mActive; public synchronized void execute(final Runnable r) {mTasks.offer(new Runnable() { public void run() { try {(); } finally {scheduleNext(); } }});if (mActive == null) { scheduleNext();} } protected synchronized void scheduleNext() {if ((mActive = mTasks.poll()) != null) { THREAD_POOL_EXECUTOR.execute(mActive);} } }

调用SerialExecutor的execute方法这里可以看到传进来一个Runnable,这个Runnable就是上文提到的mFuture(FutureTask),第九行执行了FutureTask的run方法:

public void run() { if (state != NEW ||!pareAndSwapObject(this, runnerOffset, null, Thread.currentThread()))return; try {Callablec = callable;if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result);} } finally {// runner must be non-null until state is settled to// prevent concurrent calls to run()runner = null;// state must be re-read after nulling runner to prevent// leaked interruptsint s = state;if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }

在run方法中执行了c.call,这里的c就是我们上文提到的mWorker(WorkerRunnable),

执行WorkerRunnable的call方法:

() {public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked return postResult(doInBackground(mParams));}

最后一行postResult()方法源码:

private Result postResult(Result result) { @SuppressWarnings(unchecked) Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult(this, result)); message.sendToTarget(); return result; }

我们发现就是发送了一个消息,上面的代码发送的消息由这里接受:

private static class InternalHandler extends Handler { @SuppressWarnings({unchecked, RawUseOfParameterizedType}) @Override public void handleMessage(Message msg) {AsyncTaskResult result = (AsyncTaskResult) msg.obj;switch (msg.what) { case MESSAGE_POST_RESULT: // There is only one result result.mTask.finish(result.mData[0]); break; case MESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break;} } }

消息是MESSAGE_POST_RESULT所以会执行 result.mTask.finish(result.mData[0]) ,finish源码:

private void finish(Result result) { if (isCancelled()) {onCancelled(result); } else {onPostExecute(result); } mStatus = Status.FINISHED; }

当被取消时会执行 onCancelled(result);否则就会调用 onPostExecute(result);这样我们就可以在onPostExecute方发中得到我们需要的结果result来进行下一步的处理了。

?? ?? ?? ?? ?? ?? ?? ?? ?? ??

⬗ Android工作总结 ⬗

虽然现在离那时面试的经历有一段时间了,但是我还是要说出来,希望能给想要找工作和换工作的同学们一些帮助。

先说投简历,其时我没投简历,有经验的同学们可以把简历挂到网上(最好是智联)等着公司和猎头给你电话就行,简历要尽量简洁,当然你会的技能最好写的详细些,最好一篇纸搞定。

先说小公司,小公司面了10多家,总结来说小公司远没有想象中那样要求低,很多小公司要求还是很高的,但基本问的都是些皮毛,大家只要把网上的面试题搞定就好了,不少小公司都问道了布局,因为面试官以前可能是做j2ee的,他们要转android应用层开发,界面布局还是稍微另他们头痛的事,小公司不愿花从大多成本招程序员,一个客户端往往就2,3个人开发,比较变态的是有的公司让你一个人搞定。另外小公司大多做apk,布局和界面的美化对他们来说十分重要。小公司一般都会有笔试题,都是些基础知识还有工作中常见的问题,比如手机适配方面的知识。有两家中小企业有些印象:一家忘记名字了,项目经理很牛的样子,说出他们公司为了性能整个客户端就用一个activity,这个固然可以,但是也得考虑可维护性吧,再说写成一个activity也没什么牛的,不用那么吹嘘。还有一家是中科金财,问了些布局和socket和手机地图的问题就ok了,结果我吃了大亏,报道时说第二天就派我去飞机场(客户那边),让我一个人负责客户端的开发,我说周期多长,答曰:两三个月。立马闪人,工作地点又远又偏僻,还我一个人搞开发,待遇也不高,典型的节约成本拿技术人员当驴使的公司。

轮到些大一点的公司,先说搜狐,搜狐要求还是很高的,问题是该项目经理对我这种从小公司出来的人很不感冒,他很随意但显然坐不住凳子,他说他们做了一个新浪视频客户端正在维护,让我看着他们的界面,让我简单分析他们的布局。这个问题看似简单其实很难,要全部说清楚几乎不可能。

还有千橡互动(人人网),这个公司也勉强算大吧= =,前台很牛的样子,进来让我做智力题,我说我来面试程序员,他说每个来面试的必须写,一个填图题跟智力无关,反而感觉自己被轻视了。面试官穿这脱鞋,蓬头垢面,很“牛”的样子。拿了张纸考我闰年的算法和listview的优化,期间他一直手直哆嗦,看来派了个小兵考我,再次被轻视,果断闪人(罢面)。

联想面了3次+ +,第一个项目经理还是很随和的,问了些Task的问题,activity加载模式以及一些我项目中的问题,可能我经验尚浅没进去。第二次有些变态,四个人面我,其中一个之总经理级别,面我一个小程序员不用这样吧,一人问一个问题,静态的问题啊,我项目中的问题啊,不过居然问我代码是怎写的,让我说出来,我当时无语了,早忘了啊。第三次没印象了。

土豆网很偏僻啊,我看了看他们的环境(不太好)人员也很闲散,大下午的都不在工作。项目经理有会,找可俩手下面我,感觉更像是技术PK,聊些asyncTask了,消息处理了,当我说道framework层时,显然他们就不知道了。Pk了一小时,还让我教他们关于surfaceview的知识,说他们不清楚,我刚想讲项目经理来了,可能是离职原因说的不太好吧。只差一步了啊= =,所以离职原因非常重要,想好了再说出来。

京东商城好像包了三层大楼,环境不错,来了个开发人员考我问题,问的都是项目中的问题,一些关于多线程下载的问题,问道我代码,我记错了,所以就惨了,其实我认为不应考一些代码的问题,虽然是自己写的,但过一阵都忘了,我要问面试官代码,估计他也说不出来。不过感觉不错。

阿里云,刚去时不知道是什么公司,是阿里巴巴的子公司,环境还ok,主要是项目经理不错,我们聊了一个半小时,技术问题没问太多,就是关于布局一些问题,消息处理,数据存储等一些基本题,他更关注的是你的思想,很可惜这个岗位招的是管理人员,我经验尚浅条件不符。

金山去了一趟,楼里还不错,不过我没见面试官,人事给我一张笔试题,我其实很差异大公司一般不笔试啊+ +,我看了看,三道题都拿不准,一道链表的算法题,晕菜啊没看啊。最郁闷的是,最后一道问金山快盘的原理和设计什么的,我也没用过啊,狂晕,果断闪人。

中科软,这个比较郁闷,项目经理显然很喜欢我,遗憾的是他们这没有做android开发,所以面试时最好先了解面试的公司招什么职位,具体做哪些事,变被动为主动。

中软国际,这个是做外包项目,面试题很多,主要还是基础,什么如何观看手机的内存cpu信息等等。

文思创新,临时有事直接罢面,面试题很多也很恶心,算法题考的很多,还是客观题。

还有一家大公司忘了名字了,这回彻底被鄙视,意思是我在小公司没有做过内存优化和性能方面的工作,不过面试期间我接了四个面试电话,把俩面试官凉在那也算解了气。

期间还有新浪,百度,360,创新工厂找我面试因为各种原因没去,最后去了华为,在华为可以让你的层次更高一些,因为我参与的是整机开发,如果去搜狐和千橡或者是土豆做客户端维护的,技术就容易停留到应用层了。

[android面试经历]

⬗ Android工作总结 ⬗

伴随着3G时代的到来,移动终端所能完成的功能在各行各业日益广泛和深入,移动便携的概念早已深入人心,让人们更加的依赖移动终端。

移动网络开发技术期末考核 食物相宜相克大全

专 业: 计算机科学与技术 班 级: 学生姓名: 学 号:

2014年6月

目 录

1.项目简介 ....................................1

1.设计背景 ....................................1

2.功能概要 ....................................1

2.系统分析 ....................................1

1. 需求分析 ....................................1

2.可行性分析 ....................................2

1.技术可行性分析 ....................................2

2.操作可行性分析 ....................................2

3.系统设计 ....................................2

1.总体设计 ....................................2

2.功能设计 ....................................3

3.数据库设计 ....................................3

4.交互设计 ....................................3

4.系统实现 ....................................3

1.实现平台: ....................................3

2.主要界面: ....................................3

3.主要代码 ....................................5

1.主界面代码....................................5

2.编辑数据界面: ....................................8

3.操作数据库代码: ....................................10

4.显示格式代码: .................................... 12

5.系统测试 ....................................13

计算机科学与技术专业大作业报告

1.项目简介

1.设计背景

当今,手机成为日常生活必不可少的工具,随着科学技术的发展,智能手机日趋发展成熟。Android手机操作系统是全球最受欢迎的智能手机平台之一。开发灵活性更强,各种软件层出不穷,发展前景十分广阔。

智能手改变人们使用手机的习惯,也放大人们对手机的想象。对目前形式的分析和对未来的展望,手机系统已经不仅限于通话和短信等内容,手机扩展功能日益发展壮大,利用手机里的各种基本功能,可以拓展更多更实用的软件,本程序就是用android手机系统的各种功能实现有创意且实用的食物相宜相克系统。

民以食为天,食物是生活中必不可少的,而随着人们生活水平的提高大家对食物的安全也越来越重视,然而如今的日常生活中也存在着很多食物搭配上的误区,这些错误的搭配也直接或者间接的影响着我们的健康。搭配相宜会促进营养吸收,于健康有益;搭配相克会破坏营养价值,甚至引发疾病或导致中毒。只有根据食物的属性及自身情况合理安排膳食,趋利避害,才能吃得科学,吃出健康。

本程序就是基于这么一种设计理念策划并制作完成的。

2.功能概要

本程序提供了查询和添加两种功能。

查询功能:当用户输入食物名称后,点击查询按钮,页面上显示用户查询的食物及与之相关的相宜与相克搭配。用户点击显示全部按钮,页面上显示数据库中所有数据。

添加功能:用户可以点击添加数据按钮,跳转到添加数据界面,用户可以对数据库中食物相宜相克数据进行添加,删除,修改。

2.系统分析

1. 需求分析

在智能手机日益发展壮大的今天,智能手机人人都有,而本程序的受众面相当之广泛,人人都需要吃食物,但了解食物之间如何搭配食用的人却是很少,正是因为有了这样的市场需求,本程序才得以应运而生。无论是居家主厨的家庭主妇,还是注重饮食健康的男女老少,都可以简单、快捷、方便的使用本程序查询出与之相宜或相克的食物,帮助人们了解食物的相宜相克。

2.可行性分析

随着社会与科技的发展,人们越来越注重移动、便携与方便。而随着这股潮流的发展,手机应用游戏应运而生。安卓系统作为一个市场占有超过50%的手机平台,其应用的发展非常迅猛

随着手机的.发展与普及,以及互联网技术的扩展,人们对移动通讯的需求必将需要实现多元功能化。通过移动通讯连接到Internet上,实现数据,应用等资源共享。提高了数据的资源利用,并能及时的到更新。在这样的外界环境之下,手机应用的推广得到保证。

1.技术可行性分析

Android系统平台是一个基于Linux开源的手机操作系统。它由Google公司在2007年11月5日正式发布的。

Android平台是由操作系统、中间件、界面和应用软件组成。是第一个要为移动终端创造的一款真正开放的完整的操作系统。

说道Android操作系统平台的优势,不得不提到最突出的两个特点“免费”和“开源”。

免费:Android免费提供其操作系统,让移动过电话制造商可以免费搭载Android操作系统,使得手机的制作成本大大降低,渐渐使得Android普及。

开源:Android手机制作操作系统代码的开放性,不仅让开发者可以在统一开放平台进行程序开发,而且可以解决现今市场不同智能机之间因文件格式不同造成的信息交流不便、程序内容无法移植等问题;并且Android的开机源码就意味着手机使用者不必在被动地接受移动电话制造商默认的设施和环境,使用者完全可以根据自己的想法自定义手机的配置。

2.操作可行性分析

因为该程序是一个简易的小型应用程序,开发不需要太多人力、精力,因此实现起来比较容易。对手机的性能没有过高的要求,系统利用率的占用也较低。

而且本程序功能简单,用户只要有一点手机操作经验,看过提示后,对本软件的操作就会非清楚。

3.系统设计

1.总体设计

本程序主要是为了让用户只需要简单操作就可以了解各种食物之间的相宜相克,界面应该简洁,操作简单,方便用户上手,所以功能不需要太复杂,只需要简单实用。

2.功能设计

(1)实现查找数据库中数据功能

利用向查询按钮添加监听事件来向EditText获取需要查询的数据名称,然后到数据库中查询,将结果显示TextView中,向显示全部按钮添加监听事件,用户单击显示全部按钮,调用方法把数据库中所有数据显示在界面上。

(2)实现向数据库中添加、删除、修改数据功能

利用向添加、删除、修改按钮添加监听事件来向EditText获取需要操作的数据名称及内容,然后调用方法,对数据库进行相应操作

3.数据库设计

在数据库中建立一张表,储存食物数据信息

4.交互设计

利用activity,intent实现查询和添加数据两个界面之间的交互

4.系统实现

1.实现平台:

Android 4.0.3

2.主要界面:

(1)搜索界面

在该界面中,用户可以搜素数据库中食物信息。

图1 搜素界面 图2 搜素空值

图3搜素不到数据 图4显示全部

(2)编辑界面:

在该界面中用户可以对数据库进行添加、删除、修改操作。

图5 编辑界面 图6 输入空值

3.主要代码

1.主界面代码:

2.编辑数据界面:

3.操作数据库代码:

4.显示格式代码:

5.系统测试

程序在Android 4.0.3 模拟器以及Android手机中运行测试,能够完美运行!

⬗ Android工作总结 ⬗

近来生活有点平淡,工作也够空闲,重温了《可用性工程》,为了鼓励自己认真学习,不要昏昏欲睡式啃书,故边看边写,但是写完才发现,这些都是说了很多的DD,估计大家都了解了,但是为了表彰我的努力,呵呵,贴出来秀一下:

理想情况当然是仅提供用户当前所需要的信息,并把它放在所需的地方(Jakob Nielsen)。简单的说,让用户可以在他需要的地方看到想要的东西。一起使用的信息应该在屏幕上彼此靠近,例如Qzone的音乐盒,我个人觉得有点不合理,“播放列表”和“音乐收藏”其实在操作上是紧挨的,在界面排版上理应彼此靠近,这样信息对象的操作顺序也符合了用户高效的工作原则。

当然,如果可以让用户根据自己的喜好来调节顺序就更好了。当然要给一个默认的数值了。例如:物业管理系统,首先的操作是“录入用户的资料”,然后让用户“入住”,其次再“进行装修”,等一段时间后,用户的活动可能只是“投诉,维修”之类的操作。在系统设计的时候,设计者当然要给用户一个默认的顺序,可以按照事件的发展进行;但是,最好还是给用户可以自己调节操作顺序的操作,因为当某一个操作开始的时候,可能会经历很长时间。

如图,按照了Nielsen的说法,区分了封闭性、接进性、相似性的图形形态。合理的区分相似的内容,用边框进行区分,把相关的操作尽量的靠近。

颜色的运用对界面的设计也是很重要的,有的设计者把界面设计的五颜六色,美其名曰给用户视觉冲击,但是我觉得要是不想把自己的网站,做另类版的,就慎用色彩。Jakob Nielsen提到“不要过度的使用颜色”;颜色的选择在5~7种较好,用户浏览的时候,设计者也要考虑用户的眼球,尽量使其简单记忆,不用太累的去区分颜色。据说Durrent and Trezona 做过测试,经过专业训练的用户也只能对付大约11种颜色。(其实对于色彩,我还是了解甚少,希望大家指点)

Word是一个大众的工具,使用的群体很多、很杂乱,所以可以看到他使用的颜色,包括图标,都是可以在不使用颜色的情况下辨别如何操作。Jakob Nielsen提醒“要记住,有很多人是色盲!”

3、“少即是多”,说起来惭愧,记得第一次看英文稿件的时候,还以为是“过犹不及”。

甚至到现在还不甚了解这其中的道理,以及它具体如何运用到设计中去。

例图所示,在用户使用的界面上尽量显示用户最关心的问题,和最直接的操作,而相关的“其他信息”“销售记录”等,不要在页面中显示,

在界面上添加太多的信息和数据会给用户带来多余的审视,甚至是困扰。让用户把他最关注的东西用最快捷的方式展现出来,而且是一目了然的。

一定不能使用系统语言,假如用户遇到“某某参数尚未定义”就惨了,摸不清头脑,对软件形象也大打折扣。使用用户的语言法则来书写系统的提示或相关警告,也是从交互的方式考虑呀。我遇到最好的语言就是金山打字软件的提示,当我想关闭时,系统会提示“今天累了,就到这里把”,很舒服哦。

那么如何更好的使用用户的语言呢?据说最好的方式是通过用户的投票,把所有可能出现的语句列出清单,供用户打分,然后汇总意见。有统计数据显示,使用技术语言来表达导致用户犯错的平均值是23.6个错误,但是,使用投票汇总的平均值是5.8个错误。

这个自然不用说,最好让我什么都不用记忆,早上上班一来,点击一个按钮,所有的工作都是系统自动产生,还要记忆下哪些是我想要的东西。(难度有点大了)

从设计中也有很多这样的例子,例如用户的搜索条件,用户的输入习惯,用户的id,用户经常关注的信息提示等。

同样的系统,同样的信息在所有的屏幕和对话框中显示的位置和形式应该一样,这样当用户经常使用时,就是自然遵循这个法则去操作,同时也是减少用户记忆的一个方面。当然,表单或对话框等表现形式的统一,也要依据系统自身的功能结构了,所以每个项目开始的时候,定项目的表现形式也是一大工程呀,不仅要考虑系统的扩张性,还要考虑表现形式的一致性。(如果在加上开发人员的不理解或者坚持,那……)

用户在哪里?要怎么做?那个按钮是做什么的……?一连串的问题,都会使你已有的用户偷偷的溜走喔!所以及时的用户反馈是很必要的,所以我建议我们的项目中增加用户路径和操作步骤的示意图,这样用户知道下一步做什么。同时,在按钮上添加了“alt”提示;但是当用户犯错前,我如何提示用户是不可操作的,或不建议操作的,一直都没有好的解决方法###

还有,系统或页面的相应时间也是反馈的一部分,例如apple叫我等10分钟,再不给我剩余时间的提示,我早就跑了!

不言而喻,但是undo的使用还是慎重,请查看bbs.thread-2798867-1-1.html,有相关的讨论。

七、    还有一些其他的准则,理解起来还是比较轻松的,如快捷方式、好的出错信息、避免出错、帮助和文档和经验性评估。

来自:xibei/article.asp?id=51

⬗ Android工作总结 ⬗

篇1:android获取手机IMSI号<\/h2>

1、什么是imsi号

国际移动用户识别码(IMSI:International Mobile SubscriberIdentification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息,其总长度不超过15位,使用0~9的数字。其中MCC是移动用户所属国家代号,占3位数字,中国的MCC规定为460;MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网;MSIN是移动用户识别码,用以识别某一移动通信网中的移动用户。

MNC:Mobile Network Code,移动网络码,2~3位,中国移动系统使用00、02、07,中国联通GSM系统使用01,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001;

2、获取手机imsi号

public static String getImsi {

TelephonyManager tm = context.getSystemService;

String _imsi = tm.getSubscriberId;

if){

return _imsi;

}

return “未知”;

}

3,

public static String getImsi {

TelephonyManager tm = context

.getSystemService;

String deviceid = tm.getDeviceId;// 获取智能设备唯一编号

String te1 = tm.getLine1Number;// 获取本机号码

String imei = tm.getSimSerialNumber;// 获得SIM卡的序号

String imsi = tm.getSubscriberId;// 得到用户Id

if ) {

Log.i;

return imsi;

}

return “未知”;

}

篇2:Android安卓获取ID号,本机号码,手机型号,系统版本<\/h2>

Mark一下

public void Msg1 { Toast toast = new Toast; Toast toast1 = toast.makeText; ;}//获取ID号final TelephonyManager tm = getBaseContext.getSystemService;final String tmDevice, tmSerial, tmPhone, androidId;tmDevice = “” + tm.getDeviceId;tmSerial = “” + tm.getSimSerialNumber;androidId = “” + vider.Settings.Secure.getString, vider.Settings.Secure.ANDROID_ID);UUID deviceUuid = new UUID, tmDevice.hashCode<< 32) | tmSerial.hashCode);String uniqueId = deviceUuid.toString;Msg1; //获取手机型号String strPhoneModule = android.os.Build.MODEL;Msg1; //获取系统版本String strSystemType = android.os.Build.VERSION.RELEASE;Msg1; //获取本机号码TelephonyManager phoneMgr=this.getSystemService;String strPhoneNum = phoneMgr.getLine1Number;Msg1;

篇3:Android获取验证码后倒计时程序<\/h2>

在开发是经常会遇到获取短信验证码,然后获取验证码后需要等待1分钟倒计时,这是是不能再次发送短信请求的,这是需要一个倒计时程序

这里我封装了一个Util类,希望对开发的小伙伴能有帮助,

public class TimeCountUtil extends CountDownTimer {

private Activity mActivity;

private Button btn;//按钮

// 在这个构造方法里需要传入三个参数,一个是Activity,一个是总的时间millisInFuture,一个是countDownInterval,然后就是你在哪个按钮上做这个是,就把这个按钮传过来就可以了

public TimeCountUtil {

super;

this.mActivity = mActivity;

this.btn =btn;

@Override

public void onTick {

btn.setClickable;//设置不能点击

btn.setText;//设置倒计时时间

//设置按钮为灰色,这时是不能点击的

btn.setBackground);

Spannable span = new SpannableString.toString);//获取按钮的文字

span.setSpan, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//讲倒计时时间显示为红色

btn.setText;

@Override

public void onFinish {

btn.setText;

btn.setClickable;//重新获得点击

btn.setBackground.getDrawable);//还原背景色

}

}

调用方法

然后在需要用这个的方法里new一个对象,然后调用start;方法就可以啦

CountUtil timeCountUtil timeCountUtil = new TimeCountUtil;

timeCountUtil.start;

// 获取验证码

getVerificationCode;

实现的效果图

篇4:Android获取默认浏览器信息<\/h2>

Android系统可以用如下方法获取默认浏览器信息:

public static ActivityInfo getBrowserApp {

String default_browser = “android.intent.category.DEFAULT”;

String browsable = “android.intent.category.BROWSABLE”;

String view = “android.intent.action.VIEW”;

Intent intent = new Intent;

intent.addCategory;

intent.addCategory;

Uri uri = Uri.parse;

intent.setDataAndType;

// 找出手机当前安装的所有浏览器程序

ListresolveInfoList = context.getPackageManager.queryIntentActivities;

if >0) {

ActivityInfo activityInfo = resolveInfoList.get.activityInfo;

String packageName = activityInfo.packageName;

String className = activityInfo.name;

return activityInfo;

} else {

return null;

}

}

篇5:android获取ip和本机的物理地址<\/h2>

/** * 获取ip * * @return */ public static String getLocalIPAddress { try { for ; en.hasMoreElements;) { NetworkInterface intf = en.nextElement; for ; enumIpAddr.hasMoreElements;) { InetAddress inetAddress = enumIpAddr.nextElement; if && inetAddress instanceof Inet4Address) {// return inetAddress.getAddress.toString;return inetAddress.getHostAddress.toString; } } } } catch { Log.e); } return null; } public static String getLocalIPAddress { WifiManager wifiManager = context .getSystemService; WifiInfo wifiInfo = wifiManager.getConnectionInfo; String ipAddress = FormatIP); return ipAddress; } public static String FormatIP { return Formatter.formatIpAddress; } // /获取本机IP地址 public static String getLocalIpAddress { WifiManager wifiManager = ctx .getSystemService; WifiInfo wifiInfo = wifiManager.getConnectionInfo; int ipAddress = wifiInfo.getIpAddress; try { return InetAddress.getByName, , , )).toString; } catch { return null; } } // 获取本机的物理地址 public static String getLocalMacAddress { WifiManager wifi = ctx .getSystemService; WifiInfo info = wifi.getConnectionInfo; return info.getMacAddress; }

篇6:Android手机怎么才能不卡?<\/h2>

一直以来Android给人的感觉都是各种卡顿,尤其是开的程序比较多以后,和iPhone比较起来流畅度上会有不小的差距,实际上我们只要优化得当,Android也能很流畅,丝毫不逊色于iPhone。本文主要介绍的是从系统优化、第三方软件优化以及设置优化几方面结合来改善Android的流畅度。

1.系统

刷机

系统这一块绝对是有着举足轻重的地位,一款好的系统能让Android脱胎换骨。而从Android 4.1开始,Android的流畅性可以说有了质的飞跃。Android 4.1的触控感觉非常好,这主要归功于Android 4.1的帧速度提高到了60fps,而且在触摸延迟上有更加优秀的表现。因此只要情况允许,建议所有Android手机都刷到4.1以上,这种体验绝对是以往使用4.0甚至2.3系统都不可想象的。当然,对于大部分Android手机来说,4.1还是遥不可及,只有通过第三方ROM才能达到品尝“果冻豆”的目的,这里就要特别注意第三方ROM的稳定性问题。

如果不能刷Android 4.1,那还可以选择一些第三方ROM例如原生系统AOKP或者CM系列。由于系统非常精简,这些第三方ROM也会带来流畅度的提升,当然要放弃的是官方ROM的各种自带软件和UI,这就要看用户的取舍了。

更换内核

Android手机的内核(Kernel)对手机流畅性也是有很大的影响,内核直接影响CPU的运行效率、频率变化。说到刷内核就不能不提超频,一些第三方内核支持CPU的超频,CPU频率提高了流畅度当然会有变化,当然这里也要特别注意温度和电压的控制。

CPU的超频

2.设置优化

开启性能模式

这个问题在此前的文章“如何让你的手机更省电?”中已经有提及过,很多手机默认是标准模式甚至是省电模式,这对性能是有不少影响的,因此建议不是有特别需求还是调至性能模式(位置:系统设置,因不同手机而异)。

关闭动画特效

这是一个Android 4.0才开始有的设置选项,Android 4.0有两项(窗口动画缩放以及过渡动画缩放),Android 4.1增加了动画程序时长调整。有人说Android的动画比较卡,没有iPhone顺滑,有这选项可好,你说动画不顺嘛,我关掉还不行吗?关闭了这些以后会感觉反应迅速了很多,但是牺牲了一定的视觉感受(位置:设置→开发人员选项)。

不保留活动

这个选项即把Android相对iPhone的其中一个很大的优势舍弃了,也就是我们常说的“多任务”,Android现在的高端机动不动就四核、2G RAM,如果只跑一个软件,可想而知流畅度会非常高,但是这里并不建议使用这种方法提升流畅度,没有多任务的Android更像一只三脚猫,如果只是体验一下那种感觉也无妨(位置:设置→开发人员选项),

3.第三方软件

更换启动器

实际上很多Android卡顿的罪魁祸首就是系统的启动器,现在一些品牌的手机启动器做得越来越炫丽,也越来越复杂,当然代价就是占用RAM和ROM更多,如果不是对这方面特别有要求,完全可以替换一些第三方的启动器,例如Apex、NOVA等,它们带来的流畅度提升也是非常明显的(这里使用NOVA作介绍)。

NOVA启动器默认风格趋于原生Android启动器

设置非常多样,有很多个性化选项

桌面滚动效果的调节,这也是第三方启动器的一个很大优势。

卸载系统自带程序

现在越来越多官方系统自带很多恼人的程序,而且不能卸载,这些软件往往都会开机自启动,对系统流畅度影响比较大,但是要删除这些自带软件需要获取root权限。通用一些第三方ROM也会有自带垃圾软件问题,而大部分第三方ROM都自带root,所以这个相对好解决。这里删除程序也要特别注意,不要错删一些系统软件,否则后果很严重(这里使用的是“力卓工具箱”)。

建议:卸载一些不常用的桌面插件、系统强制安装的第三方软件等

管理开机自启动项

这方面在之前的省电专题中也有提到过,减少开机自启动的软件,除了能节省电量之外,当然还能提升手机的反应速度,当然这里也不能一下把所有软件都关闭,关闭一些不需要自启动的第三方软件就可以达到目的了,如果不小心把系统本身的程序禁用了就会比较麻烦(这里使用的是“力卓工具箱”)。

建议:禁用大部分第三方软件自启动

其实很多“常识性”的问题都是以讹传讹,比较典型的就是Android比iPhone卡很多,iPhone不“拼配置”等实际上都是有误的,我们只能通过亲身使用以及测试才能知道真相,还是那句老话,眼见为实。以下是Galaxy Note II的流畅性测试,在桌面顺滑度来看完全是可以和iPhone媲美的。当然,Android要有这种程度的流畅感觉,还是需要建立在强大的硬件配置上的。

篇7:Android手机WIFI问题集合<\/h2>

现在市面上的Android手机基本都是海外发行,因此都带有WIFI功能,非常方便,另外由于Android系统的依靠于网络才能发挥其方便快捷的特点,因此WIFI也是其不可分割的一部分,那么该如何设置呢?

首先在系统主屏界面下按下Menu键,选择最后一项Settings(设置),依次进入Wireless controls(无线控制)――Wi-Fi settings(WIFI设置),将Wi-Fi勾选,再将Network notification(网络提示)打开,系统会自动进入搜索网络状态,稍等片刻搜索完毕点击可用网络,如果有密码,输入密码点击连接即可,

在WIFI日常的使用中会经常遇到一些问题,比如已连接却不能上网等,这些很有可能是因为其他的一些原因导致,大致可以分为两类,一类是程序设置问题,基 本存在与密码不对等情况。另一位是硬件问题,很可能是因为路由器固件较老不能很好的发送信号等,用户可以根据自身情况逐一排除。

篇8:诺基亚会推出 Android 手机吗?<\/h2>

诺基亚 CEO 斯蒂芬伊洛普(Stephen Elop)在 1 月底的财报电话会议上透露,诺基亚将建立或加入一个有竞争力的生态系统。很多人对此解读为,诺基亚在考虑使用 Android 或 Windows Phone 7平台。你认同这种判断码?

⬗ Android工作总结 ⬗

篇1:Android中进程管理<\/h2>

在android中,进程这个概念被淡化了,我们知道Android的每一个应用都是运行在一个独立的DVM中,他们之间互不影响;应用退出之后,并没有立马杀死进程,进程依然停留在内存中,这么做的目的是为了提高下次启动时的速度,而在Android中管理进程的模块是AMS,主要有LRU weight,OOM adj,Low Memory Killer共同来完成进程的管理。

1 LRU weightLRUweight 主要用来衡量LRU的权重,在android进程启动之后,会以ProcessRecord类型的方式创建一个实例,保存到AMS的mLruProcesses变量中,mLurProcesses会以LRU的顺序来存储进程信息。当有一下情况时会更新mLruProcesses: 1.应用程序异常退出 2.调用AMS显式杀死进程 3.启动和调度四大组件 这里以启动和调度四大组件为例,它最终会调用AMS的updateLruProcessLock方法:

final void updateLruProcessLocked { mLruSeq++;//lru序号加一 updateLruProcessInternalLocked; }

先将LRU序号加一,用于标记一次更新LRU的操作,然后调用updateLruProcessInternalLocked:

private final void updateLruProcessInternalLocked { // put it on the LRU to keep track of when it should be exited. int lrui = mLruProcesses.indexOf; if mLruProcesses.remove; int i = mLruProcesses.size-1; int skipTop = 0; app.lruSeq = mLruSeq; // compute the new weight for this process. if {app.lastActivityTime = SystemClock.uptimeMillis; } if >0) {// If this process has activities, we more strongly want to keep// it around.app.lruWeight = app.lastActivityTime; } else if >0) {// If this process contains content providers, we want to keep// it a little more strongly.app.lruWeight = app.lastActivityTime - NTENT_APP_IDLE_OFFSET;// Also don't let it kick out the first few real hidden processes.skipTop = ProcessList.MIN_HIDDEN_APPS; } else {// If this process doesn't have activities, we less strongly// want to keep it around, and generally want to avoid getting// in front of any very recently used activities.app.lruWeight = app.lastActivityTime - ProcessList.EMPTY_APP_IDLE_OFFSET;// Also don't let it kick out the first few real hidden processes.skipTop = ProcessList.MIN_HIDDEN_APPS; } while {ProcessRecord p = mLruProcesses.get;// If this app shouldn't be in front of the first N background// apps, then skip over that many that are currently hidden.if { skipTop--;}if { mLruProcesses.add;//添加到mLruProcesses合适的位置 break;}i--; } if {mLruProcesses.add; } // 如果这个进程之后总有cotent provider或者Service,重新计算 // If the app is currently using a content provider or service, // bump those processes as well. if >0) {for { if { updateLruProcessInternalLocked; }} } if >0) {for ) { if { updateLruProcessInternalLocked; }} } if {updateOomAdjLocked;调用updateOomAdjLocked 更新oom adj值 } }

这个函数主要作用 1.为该进程计算LRU序列号和LRU weight 2.根据计算出来的LRU weight,将该进程信息插入到mLRUProcesses合适的位置之中 3.如果该进程之中有content provider或者service,重新计算LRU weight 4.判断是否需要调用updateOomAdjLocked函数来更新oom adj的值

到此为止updateLruProcessLocked结束,可以看出,这个函数只是调整进程的LRU weight和在mLruProcesses中的位置,并没有直接参与进程的管理,真正参与进程管理的是updateOomAdjLocked函数,这个函数用来更新oom adj的值,这个值影响着进程的回收

2 OOM adjOOM adj 定义了一系列的OOM的调整级别,从-17到15。在Low Memory Killer机制中已经介绍过,这里看一下Android中定义了13个调整级别,在ProcessList文件中

class ProcessList { // OOM adjustments for processes in various states: // This is a process without anything currently running in it. Definitely // the first to go! Value set in system/rootdir/init.rc on startup. // This value is initalized in the constructor, careful when refering to // this static variable externally. static final int EMPTY_APP_ADJ = 15; // This is a process only hosting activities that are not visible, // so it can be killed without any disruption. Value set in // system/rootdir/init.rc on startup. static final int HIDDEN_APP_MAX_ADJ = 15; static int HIDDEN_APP_MIN_ADJ = 7; // This is a process holding the home application -- we want to try // avoiding killing it, even if it would normally be in the background, // because the user interacts with it so much. static final int HOME_APP_ADJ = 6; // This is a process holding a secondary server -- killing it will not // have much of an impact as far as the user is concerned. Value set in // system/rootdir/init.rc on startup. static final int SECONDARY_SERVER_ADJ = 5; // This is a process currently hosting a backup operation. Killing it // is not entirely fatal but is generally a bad idea. static final int BACKUP_APP_ADJ = 4; // This is a process with a heavy-weight application. It is in the // background, but we want to try to avoid killing it. Value set in // system/rootdir/init.rc on startup. static final int HEAVY_WEIGHT_APP_ADJ = 3; // This is a process only hosting components that are perceptible to the // user, and we really want to avoid killing them, but they are not // immediately visible. An example is background music playback. Value set in // system/rootdir/init.rc on startup. static final int PERCEPTIBLE_APP_ADJ = 2; // This is a process only hosting activities that are visible to the // user, so we'd prefer they don't disappear. Value set in // system/rootdir/init.rc on startup. static final int VISIBLE_APP_ADJ = 1; // This is the process running the current foreground app. We'd really // rather not kill it! Value set in system/rootdir/init.rc on startup. static final int FOREGROUND_APP_ADJ = 0; // This is a process running a core server, such as telephony. Definitely // don't want to kill it, but doing so is not completely fatal. static final int CORE_SERVER_ADJ = -12; // The system process runs at the default adjustment. static final int SYSTEM_ADJ = -16; .....}

AMS提供了函数来改变这个值:updateOomAdjLocked

final void updateOomAdjLocked { final ActivityRecord TOP_ACT = resumedAppLocked; final ProcessRecord TOP_APP = TOP_ACT != null ? TOP_ACT.app : null; if {RuntimeException e = new RuntimeException;e.fillInStackTrace;Slog.i; } mAdjSeq++; // Let's determine how many processes we have running vs. // how many slots we have for background processes; we may want // to put multiple processes in a slot of there are enough of // them. int numSlots = ProcessList.HIDDEN_APP_MAX_ADJ - ProcessList.HIDDEN_APP_MIN_ADJ + 1; int factor = -4)/numSlots; if factor = 1; int step = 0; int numHidden = 0; // First update the OOM adjustment for each of the // application processes based on their current state. int i = mLruProcesses.size; int curHiddenAdj = ProcessList.HIDDEN_APP_MIN_ADJ; int numBg = 0; while {i--;ProcessRecord app = mLruProcesses.get;//Slog.i; //调用重载函数updateOomAdjLocked,更新OOM adj的值updateOomAdjLocked;if { step++; if { step = 0; curHiddenAdj++; }}if { // 如果adj的值大于等于ProcessList.HIDDEN_APP_MIN_ADJ if { numHidden++; if {Slog.i: hidden # + numHidden);EventLog.writeEvent;app.killedBackground = true;Process.killProcessQuiet;//杀死进程 } else {numBg++; } } else if { numBg++; }} } ...... }

其中调用了重载函数updateOomAdjLocked,具体代码如下:

private final boolean updateOomAdjLocked { app.hiddenAdj = hiddenAdj; if {return false; } final boolean wasKeeping = app.keeping; boolean success = true; // 1调用computeOomAdjLocked方法计算oom adj的值 computeOomAdjLocked; if {if { // Removing for now. Forcing GCs is not so useful anymore // with Dalvik, and the new memory level hint facility is // better for what we need to do these days. if { // If this app is transitioning from foreground to // non-foreground, have it do a gc. scheduleAppGcLocked; } else if { // Likewise do a gc when an app is moving in to the // background . scheduleAppGcLocked; }}if { // This app is no longer something we want to keep. Note // its current wake lock time to later know to kill it if // it is not behaving well. BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics; synchronized { app.lastWakeTime = stats.getProcessWakeTime); } app.lastCpuTime = app.curCpuTime;}app.setRawAdj = app.curRawAdj; } if {// 2 调用setOomAdj来修改进程的oom adj的值 if ) { if Slog.v; app.setAdj = app.curAdj;} else { success = false; Slog.w;} } if {app.setSchedGroup = app.curSchedGroup;if Slog.v;if { Slog.i + : + app.waitingToKill); EventLog.writeEvent; // 3 调用killProcessQuiet杀死进程 Process.killProcessQuiet; success = false;} else { if { long ldId = Binder.clearCallingIdentity; try { // 4调用setProcessGroup修改进程的调度组 Process.setProcessGroup; } catch {Slog.w;e.printStackTrace; } finally {Binder.restoreCallingIdentity; } } else { if {try { app.thread.setSchedulingGroup;} catch {} } }} } return success; }

函数updateOomAdjLocked,更新OOM adj的值,这一部分的主要工作有: 1.调用computeOomAdjLocked方法计算oom adj的值,这个函数比较复杂,通过一系列的运算,计算出oom adj的值 2.调用setOomAdj来修改进程的oom adj的值,这个函数就是向进程的/proc/

/oom_adj文件写入计算出来的oom adj值 3.调用killProcessQuiet杀死进程 4.调用setProcessGroup修改进程的调度组 这里主要看第三步killProcessQuiet,这个函数在Process.java文件中:

public static final void killProcessQuiet { sendSignalQuiet; }调用了 sendSignalQuiet函数,这是一个native函数:

public static final native void sendSignalQuiet;对应的实现在android_util_Process.cpp文件中:

void android_os_Process_sendSignalQuiet{ if { kill;//杀死进程 }}到此为止进程杀死了,这种方式是直接杀死进程的方式,同样android还提供了一个被动杀死进程的机制 Low Memory Killer机制

3 Low Memory Killer机制 这一机制的主要思想就是定义不同的oom adj级别,并为每一个级别指定最小剩余阈值,

当内存中可用内存小于该阈值时,就杀死所有等于或者大于该级别的进程,这部分参看 Low Memory Killer机制

篇2:关于Android电源管理<\/h2>

使用Android电源管理widget 从Android 2.1系统开始内置了一个非常强大的带能源管理 widget通过这个widget你可以快速开启或者关闭Wi-Fi,蓝牙 ,GPS,同步这些手机耗电大户,还可以方便的设定手机屏幕 亮度,长按手机屏幕,就可以在widgets目录选择启用,

关于Android电源管理

篇3:农业化进程中项目管理论文<\/h2>

1通过项目管理推进山西农业化进程

1.1具体项目实例

在山西进行的多方面农业项目建设中,文水县做得比较好,已投资2.7亿元,在全县13个乡镇成立了人才引进和劳动力转移协会,22个重点农业产业化项目正在稳步推进,并且还建设了17个农民专业合作社、10个“一村一品”专业村,在农业产业化进程上迈出了一大步。22个重点项目中,既有出口西兰花标准化基地、葡萄温室试验示范基地、设施蔬菜示范园区,也有肉鸡养殖示范园区、貉子养殖基地等。其中瑞驰景田的200hm2西兰花种植基地成为全省最大保鲜蔬菜出口备案基地,产品远销韩国、新加坡、马来西亚等国家和地区,西兰花种植销售收入达到195000元/hm2,利润75000元/hm2,直接带动农户余户,间接安置农村富余劳动力500余人。北国风特种养殖第一期工程已竣工投入使用,第二期工程正加紧建设,已饲养貉子1.2万只。目前文水县在大项目稳步推进的同时,农业产业已基本形成十大产业链条,模式也日渐成熟,对促进农业化进程的效用非常明显。

1.2项目推进山西农业化进程分析

随着我国经济的发展,地方经济也获得相应提升,与此同时,受到加入世贸组织后期保护层被掀开的`影响,我国农业面临的竞争也在日渐加大,在这种情况下对农业发展提出了更高的标准要求。山西省具有“农业大省”的标签,如果没有注重对农业模式的更新优化,那么这个标签迟早被替代。为了提升自身的农业实力,山西省积极引入项目管理理念,并在实践中发挥其实际效用,使农业项目的效益转化非常明显。

目前,山西省的各项农业项目管理工作在有条不紊地进行着,实践证明,项目管理工作越到位,项目效益越显著。我们知道,山西农业是由众多大小项目集结形成的一个整体,只有当项目运行效果良好,并能实现效益,山西农业才能获得发展。总之,要加快山西农业化进程脚步,就需要项目管理发挥重大作用,而一旦项目管理发挥重要功效,势必会推进山西农业化进程。

篇4:Android进程意外停止的解决办法<\/h2>

1、错误信息:com.cess.gapps进程意外停止

错误程序:Gtalk

解决办法:重新安装google talk

2、错误信息:com.google.android.voicesearch进程意外停止

错误程序:Google语音搜索

解决办法:重新安装voicesearch.apk

注:假如你是在替换原本的浏览器之后在用语音搜寻时候出现的这个错误信息,那么只要换回原来的浏览器就能解决了。

3、错误信息:com.cess.acore已意外停止

错误程序:背景同步数据

解决办法:设置---数据同步---背景数据同步,小房子退出

4、错误信息:com.google.android.apps.map进程意外停止

错误程序:Google map

解决办法:尝试着卸载地图,安装最近版本

5、错误信息:com.google.android.googleapps进程意外停止

错误程序: 电子市场

解决办法:启动背景数据,不好使的话wipe data

6、错误信息:com.android.phone进程意外停止

错误程序:移**络--CM核心

解决办法:这个问题就大了,刷ROM吧

7、错误信息:com.android.set进程意外停止

错误程序:设置

解决办法:刷ROM吧

8、错误信息:com.htc.launcher进程意外停止

错误程序:htc sense

解决办法:设置―应用程序com.htc.launcher―清除数据

9、错误信息:com.vider进程意外停止

错误程序:htc后台程序支持

解决办法:wipe data

10、错误信息:com.htc.album进程意外停止

错误程序:自带相册

解决办法:重新安装相册即可

11、错误信息:com.htc.bgp进程意外停止

错误程序:日历 com.htc.bgp

解决办法:把\system\app\Calendar.apk装回去应该就可以了

12、错误信息:com.htc.Touch FLO进程意外停止

错误程序:htc sence界面

解决办法:清除数据即可]

篇5:如何快捷管理Android通话记录<\/h2>

管理Android通话记录 Android通话记录非常方便,

长按任意一条播出或者接入电话 记录就可以选择删除,非常easy,

如何快捷管理Android通话记录

篇6:Android部份进程意外停止的解决办法<\/h2>

修改Hosts的方法:

安卓 Android手机是和Google帐号紧密联系的,由于$^&情况,很多时候Google帐号无法登录,导致 电子市场 无法使用,

Android部份进程意外停止的解决办法

。在电脑上我们通过修改Hosts方法可以解决Google帐号的登录问题,在Android手机上也可以使用这个方法。

具体操作过程是:

先通过各种方法让Android手机获取Root权限,之后运行 RE文件管理器 Root Explorer ,进入可写状态,找到/system/etc/hosts的文件,将其权限修改为可写。打开超级终端Terminal Emulator,输入su,进入root模式,输入 vi /system/etc/hosts 命令,按i进入编辑模式,之后将用户电脑上的hosts文件内容也输入进去。Android虚拟终端下当vi在编辑模式时,按下“确定”键(Trackball),再按下虚拟键盘上的“1”,就可以退出编辑模式了(CTRL+[),这个时候使用:wq就可以保存退出了,之后重启手机即可。

======================================================

输入法切换方法:

我们的Android手机可以安装多个输入法,并且方便的进行切换,这样可以适合各自的使用。

具体的安装和切换方法为:

1、首先下载安装包,然后解压后存放在内存卡中,然后点击安装。

2、安装完成后,我们在桌面按menu键,选择settings(设置)-Locale&Text(区域和文本),这里有设置选项,根据自己的需要进行选择。

3、打开短信,在输入时长按输入框,会弹出选择输入法的对话框。

这样就可以很方便的对Android手机输入法进行切换了。

解决办法:清除数据即可

篇7:Android部份进程意外停止的解决办法<\/h2>

错误信息:com.cess.gapps进程意外停止

错误程序:Gtalk

解决办法:重新安装google talk

错误信息:com.google.android.voicesearch进程意外停止

错误程序:Google语音搜索

解决办法:重新安装voicesearch.apk

注:假如你是在替换原本的浏览器之后在用语音搜寻时候出现的这个错误信息,那么只要换回原来的浏览器就能解决了,

错误信息:com.cess.acore已意外停止

错误程序:背景同步数据

解决办法:设置---数据同步---背景数据同步,小房子退出

错误信息:com.google.android.apps.map进程意外停止

错误程序:Google map

解决办法:尝试着卸载地图,安装最近版本

错误信息:com.google.android.googleapps进程意外停止

错误程序:电子市场

解决办法:启动背景数据,不好使的话wipe data

错误信息:com.android.phone进程意外停止

程序:移动网络--CM核心

办法:这个问题就大了,刷ROM吧

信息:com.android.set进程意外停止

错误程序:设置

解决办法:刷ROM吧

错误信息:com.htc.launcher进程意外停止

错误程序:htc sense

解决办法:设置―应用程序com.htc.launcher―清除数据

错误信息:com.vider进程意外停止

错误程序:htc后台程序支持

解决办法:wipe data

错误信息:com.htc.album进程意外停止

错误程序:自带相册

解决办法:重新安装相册即可

误信息:com.htc.bgp进程意外停止

错误程序:日历 com.htc.bgp

解决办法:把\system\app\Calendar.apk装回去应该就可以了

错误信息:com.htc.Touch FLO进程意外停止

错误程序:htc sence界面

解决办法:清除数据即可

篇8:Android中AsyncTask使用<\/h2>

一、AsyncTask的作用:

代替Thread+Handler的组合,使创建异步任务变得简单,

AsyncTask执行后台操作,并在用户界面上发布结果,而不必处理线程。

二、AsyncTask的定义:

public abstract class AsyncTask

extends Object

AsyncTask必须子类可以使用。子类将覆盖至少一个方法(doInBackground执行异步任务),通常会覆盖一次(onPostExecute显示结果,更新UI)

AsyncTask三种类型如下:

》Params,参数的类型发送到任务执行时。

》Progress,在后台计算过程中公布的进度单元类型。

》Result,计算结果的类型。

不是所有类型都是异步任务所使用的。要标记为未使用的类型,设置该类型Void:

三、AsyncTask的方法:

1、onPreExecute

在任务开始后立即调用,在UI线程执行。这一步通常用于设置任务,例如在用户界面中初始化进度条。

后台线程调用onPreExecute完成后立即执行。这一步后台进程执行,可能会花费很长时间。

调用publishProgress,在UI线程上执行,

这种方法是用来显示用户进度界面,后台进程仍在执行。例如,它可用于显示一个进度条或在文本中显示日志。

后台进程处理完后,在UI线程上执行。后台进程的结果被传递到这一步作为参数。

常用的写法如下:

class MyTask extends AsyncTask{ @Override protected String doInBackground { //执行异步任务 int n = 10; //调用publishProgress公布进度,最后onProgressUpdate方法将被执行 publishProgress; Thread.sleep;return null; } @Override protected void onPostExecute { //更新UI,显示结果 } @Override protected void onProgressUpdate { //更新进度信息 }

new MyTask.execute;//执行任务

三、AsyncTask的规则:

1、任务实例必须在用户界面线程中创建。

2、execute方法必须在UI线程中调用。

3、不要手动调用onPreExecute,doInBackground,onProgressUpdate,onPostExecute这些方法

4、一个任务实例只能执行一次,如果执行第二次将会抛出异常

篇9:Android中数据库升级<\/h2>

public class MySQLiteHelper extends SQLiteOpenHelper {public static final String SQL_CREATE= “create table news ”; public MySQLiteHelper { super;} @Overridepublic void onCreate { db.execSQL; } @Overridepublic void onUpgrade {} }

当我们如上创建了个SQLiteHelper,我们知道会在本地的目录database中生成了个.db数据库文件! 可是我们遇到版本迭代往往要做更多的事情 这时候的会再创建个新的数据库

这时候我们编译完成之后发现没有在database相对应的目录下生成一个相对应的表,

Android中数据库升级

,当然我们在调试代码的时候可以清楚应用数据这样重新运行的时候会把onCreate方法再次执行一次那当然就会把未生成成功的表生成出来,可以在用户迭代更新应用的时候总不能每次都清楚数据是吧! 所以:

@Override“ int=”int“ name=”code“ newversion=”newVersion)“ oldversion=”oldVersion,“ oncreatedb=”onCreate;“ onupgradesqlitedatabase=”onUpgrade 的时候就会执行onUpgrade方法,然后在在该方法中写入相对应的操作就会在database下生产相对应的表而不需要用户去清除应用的数据。

当然这种方法有一个很严重的弊端就是 可能我们在发布版本的时候忘记修改该version导致无法操作数据引起一系列不可收拾的bug。 所以推荐使用LitePal开源库进行对数据库操作!详情可见 点击打开链接

篇10:Android简单的学生管理系统<\/h2>

(1)管理系统实现的功能主要是:学生、教师的注册登录,和选课,以及修改学生的成绩等基本简单的功能,最主要的是实现一些Dialog的使用,

界面如下:

(2)主要代码如下:(个人留作笔记,如需要完整代码,在最下边免费下载)

下边是一个适配器,适配器是为了一个listvie进行设置值,其中加载的是一个itemview,适配器中还是用了继承的方法,用于通知适配器进行更新。vcD4NCjxwcmUgY2xhc3M9“brush:java;”>public class CourseAdapter extends BaseAdapter { private Context context; private ListcoursetList; public CourseAdapter { ntext = context; ursetList = coursetList; } public int getCount { return coursetList.size; } public Object getItem { return coursetList.get; } public long getItemId { return position; } /** * 通知adapter更新数据 */ @Override public void notifyDataSetChanged { super.notifyDataSetChanged; } public View getView { if {//这里加载的每一个item条目的布局文件convertView = LayoutInflater.from.inflate; } TextView tv_name = convertView.findViewById; TextView tv_course = convertView .findViewById; TextView tv_score = convertView.findViewById; // 获得某一个位置的student Course course = coursetList.get; tv_name.setText + ); tv_course.setText + ); tv_score.setText + ); return convertView; }}

(3)还用到了Java的反射机制,结合工厂模式进行操作:

public class PersonFactory { /** * 根据类的名称来生产对象:java的反射机制使用 ** @param className * @return */ public PersonInter getPersonByClass { try {PersonInter personInter = Class.forName.newInstance;return personInter; } catch {e.printStackTrace; } catch {e.printStackTrace; } catch {e.printStackTrace; } return null; } /** * 根据类型来创建对象 */ public PersonInter getHair { if ) {return new StudentImpl; } else if ) {return new TeacherImpl; } return null; } /** * 根据类的名称来生产对象:java的映射 */ public PersonInter getPersonByClassKey { try {Mapmap = new PropertiesReader.getProperties;PersonInter person = Class.forName).newInstance;return person; } catch {e.printStackTrace; } catch {e.printStackTrace; } catch {e.printStackTrace; } return null; }}

⬗ Android工作总结 ⬗

1、负责具体项目/任务的详细设计、编码,软件产品项目规划工作,制定具体项目实施方案及软件开发技术和规范及标准流程的改进;

2、参与项目/任务的模块架构、数据库的设计,解决项目/任务开发中遇到的'各种问题,完成相应模块软件的设计、开发、编程任务;

3、整合并优化项目开发所需各种资源;

4、负责相关技术文档的编写(如各类设计文档、数据库文档、测试文档等);

5、阶段性和周期性的向部门领导汇报项目/任务的最新情况,对于可能发生的任何风险进行上报。

⬗ Android工作总结 ⬗

有一名话叫做:不经过风雨,怎么见彩虹?我想改一下:不真正进入社会,怎能了解社会呢?

在这次实习中,给我收获最大的是我觉得很多工作需要我去摸索和探讨,要不怕吃苦,勇于激流勇进,有的工作虽然单挑又重复,但这是磨练意志最有效的方法,我告诫自己要认真完成,对每项工作都要他看成是公司对自己的一次考核,做到每一件事的过程中遇到困难,一定要争取不抛弃,不放弃,坚持“战斗”,只要希望还在,胜利一定属于我们。

在此次专业实习的过程中,我进入了广州外语通科技有限公司当任Android开发实习生,并参加了两次大项目的研发,从实际到理论,加深了我们对软件技术专业的理解,和对于与社会接轨的深刻感受。

作为学生,我们更多的是课本的知识的理解,理论的优势是我们的特色,但是怎样将理论结合实际却是摆在我们面前的难题。而参观广州外语通科技有限公司正视给了我们直观的解读。广州外语通科技有限公司建立了一整套符合国际标准的质量、成本和交付体系,软件开发质量控制和过程改善能力已达到了国际先进水平,秉承“用开拓的意识、创造新的价值”的企业理念,不断跟踪国际先进技术与管理思想,研发和提供优质软件产品和技术服务,为客户不断创造和提升价值。正是因为秉持这样的理念其完整的价值链和细致的软件服务,给了我们以软件技术专业的具体实际的体验。与此同时,广州外语通科技有限公司企业的参观使我们对中国物流企业的现状有了大概的了解,参观过程中不同仓库的设施和地面的设置的挑选更是让我们多了超出理论的认识。通过指导人员的讲解我们对中国物流企业的信息化有了大致的了解:中国物流企业信息化整体水平不高是其信息化建设的核心问题。这包括:标准不统一,资源浪费严重;大型应用软件系统应用不普遍,应用层次低;现有各软件系统之间相互孤立,形成“信息孤岛”;信息化建设发展不平衡,造成“信息鸿沟”;硬件设备的利用率不高,资源浪费严重;综合信息系统是物流业信息化建设的必然趋势。

⬗ Android工作总结 ⬗

1. 请描述下Activity的声明周期。

onCreate->onStart->onRemuse->onPause->onStop->onRestart->onDestroy

2. 如果后台的Activity由于某种原因被系统回收,如何在回收之前保存当前状态。

onSaveInstanceState().

程序中的某一个Activity A 在运行时,主动或被动的运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又回来找A,这个时候有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被回收的就直接执行onResume(),跳过onCreate()。

3. 如何将一个Activity设置成窗口样式。

在AndroidManifext.xml中Activity定义处添加

android:theme="@android:style/Theme.Dialog" 或

android:theme="@android:style/Theme.Translucent"。

4. 如何退出Activity?如何安全退出已调用多个Activity的Application?

1.Activity.finish();也可以用killProcess()和System.exit()这样的方法

2.用ActivityManager的restartPackage方法

5. 请介绍下android大众常用的五种布局。

FrameLayout(框架布局)

只可以有一个控件,并且不能设计这个控件的位置,控件会放在左上角

LinearLayout(线性布局)

一行只能控制一个控件的线性布局,所以当有很多控件需要在一个界面中列出时,可以用LinearLayout布局

AbsoluteLayout(绝对布局)

可以放置多个控件,并且可以自己定义控件的x,y的位置

RelativeLayout(相对布局)

比如要在一行上显示多个控件,这时就要用到相对布局

TableLayout(表格布局)

将子元素的位置分配到行或列中,一个TableLayout由许多的TableRow组成

⬗ Android工作总结 ⬗

最近在继续iPhone业务的同时还需要重新拾起Android。在有些生疏的情况下,决定从Android源码中感悟一些Android的风格和方式。在学习源码的过程中也发现了一些通用的模式,希望通过一个系列的文章总结和分享下。

职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

Android系统中根据XML排布文件创建界面的过程中通常需要针对不同类型的控件通过各种工厂生成。考虑到效率问题,Android采用了一个标准职责链模式的`变种,我将这称之为“AB计划”。区别示意图如下所示:

标准职责链

AB计划职责链

LayoutInflater中的工厂职责链设计如下图所示:

其中FactoryMerger包含两个工厂f1和f2,创建时候会先通过f1创建,如果失败会尝试f2。而且由于FactoryMerger也实现了Factory接口,因此也可以聚合到更高一层的FactoryMerger。和标准职责链模式相比,无法确保各个链节之间的先后关系,但如果聚合合理就可以有效减少递归次数,实现代码如下:

public interface Factory {

public View onCreateView(String name, Context context, AttributeSet attrs);

}

private static class FactoryMerger implements Factory {

private final Factory mF1, mF2;

FactoryMerger(Factory f1, Factory f2) {

mF1 = f1;

mF2 = f2;

}

public View onCreateView(String name, Context context, AttributeSet attrs) {

View v = mF1.onCreateView(name, context, attrs);

if (v != null) return v;

return mF2.onCreateView(name, context, attrs);

}

}

其中,Factory 和FactoryMerger 分别是LayoutInflater内嵌接口和内嵌类。

本文来源://www.hn373.com/zongjie/85650.html

上一页:高中物理教师实习报告(集锦十四篇)
下一页:大学巾帼建功岗事迹材料(必备十二篇)
Android工作总结相关推荐 更多

最新内容 更多

热门排行 更多

推荐访问 更多