推荐第1篇:学安卓开发学哪些内容
Android曾经是一家创立于旧金山的公司的名字,该公司于2005年8月份被Google收购,并从此踏上了飞速发展的道路。经过这几年的发展,它已经发展成了一个平台、一个生态体系。现在Android在移动领域已经得到了广泛的应用。根据Google于2011年6月份公布的数字,
Android曾经是一家创立于旧金山的公司的名字,该公司于2005年8月份被Google收购,并从此踏上了飞速发展的道路。经过这几年的发展,它已经发展成了一个平台、一个生态体系。现在Android在移动领域已经得到了广泛的应用。根据Google于2011年6月份公布的数字,现在每天激活的Android设备高达50万台,比5月份的数据增加了10万台!Google还透露目前已经与36家OEM厂商和215家运营商合作,共激活了超过1亿台Android设备。下面是由卓跃教育给大家带来的分析。
由于Android是近几年才开始起步的,所以有很多朋友也总是会有学习Android有前途么这样的疑问。第
一、这个市场是否足够大(或者能发展到足够大), Android这几年的发展可谓有目共睹,就像前面所说,每天的设备激活数目就达到了50万台;其三,是否有足够多的大公司参与其中,或者是否成就了一些公司。行业的发展,离不开业内大公司的支持,或者,是否有公司在该领域得到了长足的发展。处于这个行业的大公司,除了Google本身外,也成就了一些公司,例如Motorola移动、HTC,前者借Android咸鱼翻身,后者借Android
成了市值超越Nokia的公司。
学习Android有前途么?相比于Symbian的日落西山,以及苹果的封闭、Windows Phone的前途未卜,Android无疑代表了当前行业发展的主流趋势:开放平台取代了封闭平台。让参与者均能通过自己的努力而获益。 织梦内容管理系统
目前国内的Android开发还是主要以应用开发为主,主要分成3类:为企业开发应用、开发通用应用(放到Android Market或者其他App Market销售)以及游戏开发(放到Android Market或者其他App Market销售)。
第一类开发者一般身处规模较大的公司,这些公司主要为自有品牌或者其他品牌设计手机或者平板电脑的总体方案。除了根据需求对系统进行定制外,更多的工作在于为这些系统编写定制的应用。第二类开发者,一般处于创业型公司或者是独立开发者,他们的盈利方式主要是2种:为国外公司进行外包开发,或者通过Google的移动广告(AdMob)通过广告点击分成。而理论上的通过付费下载的形式来盈利的,现在国内鲜见成功者。第三类开发者,目前和第二类开发者类似。下图是开发者提交的应用和游戏的数目所占的比例图,从中也可以看出应用开发数目远超游戏开发。
android是以linux为核心的手机操作平台,作为一款开放式的操
作系统,随着android的快速发展,如今已允许开发者使用多种编程语言来开发android应用程序,而不再是以前只能使用java开发android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。iphone上市,用户可以更加方便地连接网络,运营商的制约减少。
android/iphone在中国的前景十分广阔,首先是有成熟的消费者,在国内,android/iphone社区十分红火,这些社区为android/iphone在中国的普及做了很好的推广作用。国内厂商和运营商也纷纷加入了android/iphone阵营,包括中国移动,中国联通,华为通讯,联想等大企业,同时不仅仅局限于手机,国内厂家也陆续推出了采用android/iphone系统产品,我们可以预见android/iphone也将会被广泛应用在国产智能上网设备上,这让我们看到未来的android/iphone市场一定会推进更好、更快的创新,为移动用户提供不可预知的应用和服务。
3G梦工场 咨询电话:400-6131-500 咨询QQ: 1758158985作为湖北首家iphone和安卓双专业的高端3G游戏软件开发学校.3G梦工场全程教育过程中,以上机实际操作为主,采取项目实 例教学模式,以市场就业为根本目的,以学员作品上线销售为 指导,并增加素质培养课程,名师面授,小班教学,让每一个学生每一堂课都充分吸收。
推荐第2篇:如何学习安卓开发
如何学习安卓开发?安卓开发学习已经成为IT行业的新潮流。时下,Android也以其创造力、前瞻性、延续性和实现能力成为行业首领,可是怎么学好Android呢?今天,欧柏泰克的老师告诉你如何学好Android。
熟悉Java基础知识
Android应用的开发语言用的是Java语言,并且在Android中也用到了Java核心类库的大量的类,因此,在学习Android开发之前,可以先把Java基本语法和Java SE的基础类库好好学习一下。Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。 建议在Android课程前期的Java学习阶段中,需要用心的学好。
熟悉一门编程语言
现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程,只是很多同学在大学期间并没有好好学习,如果对它掌握的不太好或者很久没用了,建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行、调试它。如果没有学过,不妨也提前学习一下。大部分的高校所开设的C语言使用的教材都是用它作为教材,因此无论是购买还是借阅,都容易找到;
熟悉数据结构和算法基础知识
如果后续有志于游戏方面的开发,最好具备一定的数据结构和算法基础知识。虽然现代的高级编程语言中,其类库中已经帮我们实现了大部分的数据结构,一般情况下,我们直接使用即可。但如果能对其原理有所了解,当需要在这些数据结构和算法中间的时候,可以更加的清楚到底应该选择哪个数据结构或者算法。另外,在图形图像处理上面,线性代数的作用也非常重要,如果能掌握一点这方面的基础知识,无疑也会在后续的学习中如虎添翼。
推荐第3篇:安卓NFC开发学习笔记
大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/docs/index.html
目前NFC应用的大的框架上的理解:
我使用的API LEVEL是19,支持的API有三个:android.nfc,android.nfc.cardemulator,android.nfc.tech NFC在手机上的应用大体分为两类:读卡器和卡
android.nfc.cardemulator接口是为NFC作为卡应用提供的接口,在较低版本的API上是没有的
android.nfc.tech,android.nfc接口是为NFC作为读卡器应用提供的接口
首先说作为卡,nfc有两种实现方式,一个是使用NFC芯片作为卡,另一个是使用SIM作为卡
Figure 1.NFC card emulation with a secure element.至于从读卡器发送的指令到底是传递到NFC芯片还是SIM由NFC Controler控制,图中Secure Element是指SIM,Host-CPU指NFC芯片 android提供HostApduService用于NFC芯片,OffHostApduService用于SIM芯片,传递方向在res/xml文件中通过AID来控制
ps:Host-Based Card Emulator 简称为HCE
代码实现:
AndroidManifest.xml 中 配置service,因为作为卡实现的话,NFC功能是作为service存在的
android:permiion=\"android.permiion.BIND_NFC_SERVICE\">
android:resource=\"@xml/apduservice\"/>
res/xml/apduservice.xml 中配置service响应的AID
android:requireDeviceUnlock=\"false\">
android:category=\"other\">
配置文件完成后编写service的处理方法:
NFCService需要继承HostApduService,如果需要与Activity通信,建议采用广播方式
也可以自己实现观察者模式,只是这样就需要持有Activity的引用,感觉不太好 NFCService.java public cla NFCService extends HostApduService {
private Intent intent = new Intent(\"com.example.communication.RECEIVER\");
@Override public void onCreate() {
//启动Acivity
Intent i = new Intent();
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//需要启动的Activity不是当前Activity的时候需要用FLAG_ACTIVITY_NEW_TASK
i.setAction(\"com.apdu.nfc\");
getApplication().startActivity(i);
Toast.makeText(getApplicationContext(), \"Service启动\", Toast.LENGTH_LONG).show();
} @Override public byte[] proceCommandApdu(byte[] commandApdu, Bundle extras) {//当注册的AID被选中后,后续指令被分发到这个处理函数中
byte[] sw = new byte[]{(byte)0x90,(byte)0x00};
byte[] response = new byte[5];
if (commandApdu[0]==(byte)0x00 &&commandApdu[1]==(byte)0xA4&& commandApdu[2]==(byte)0x04
&& commandApdu[4]==(byte)0x07&& commandApdu[5]==(byte)0xF0)
{
return sw;
}
else
{
//apdu处理逻辑
switch(commandApdu[1])
{
case (byte)0xA8:
break;
case (byte)0xAE:
break;
default:
return sw;
}
}
intent.putExtra(\"command\", commandApdu);
intent.putExtra(\"response\", response);
sendBroadcast(intent); //利用广播与Activity通信
return response; //SW值需要包含在response中
}
@Override public void onDeactivated(int reason) {
if (reason==HostApduService.DEACTIVATION_DESELECTED)
{
Toast.makeText(getApplicationContext(), \"已选择其它应用\", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), \"连接断开\", Toast.LENGTH_LONG).show();
} }
@Override
public void onDestroy()
{
Toast.makeText(getApplicationContext(), \"Service关闭\", Toast.LENGTH_LONG).show(); super.onDestroy();
}
框架搭建好剩余的事情就很简单了,apdu的处理逻辑在proceCommandApdu方法中实现即可
以上是Host-CPU方式的实现,SIM方式,API介绍中说该方式没有提供可供操作的API,也就是说Android不会监听SIM卡与读卡器之间的通信
所以NFCOffService 只需要实现onBind接口,这样绑定该Service的Activity可以对NFCOffService进行有限操作 public cla NFCOffService extends OffHostApduService {
@Override public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null; } } 上面没有提到的就是,如果你需要使用NFC,需要在Manifest中申请NFC权限: 现在来说说NFC芯片作为读卡器的应用场景以及实现
android.nfc.tech,android.nfc接口是为NFC作为读卡器应用提供的接口 接口定义了三种Action Tags:ACTION_NDEF_DISCOVERED,ACTION_TECH_DISCOVERED,ACTION_TAG_DISCOVERED。
当你在Manifest文件中将Activity的action-filter设置为这三个Tag中的一种或几种时,NFC响应事件会按照如图流程处理
我的理解是ACTION_NDEF_DISCOVERED 是用于两台NFC手机之间传输文件的
ACTION_TECH_DISCOVERED,ACTION_TAG_DISCOVERED才是用于NFC与卡进行通讯的 所以开发第一步是在Manifest中配置你的Action:
android:resource=\"@xml/nfc_tech_filter\" /> TECH_DISCOVERED还需要配置meta-data,meta-data的作用相当于补充说明或者一些配置信息 nfc_tech_filter.xml
android.nfc.tech.IsoDep
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.Ndef
android.nfc.tech.NdefFormatable
android.nfc.tech.MifareClaic
android.nfc.tech.MifareUltralight
当然API中说明你可以将多个tech写在一个tech-list中,我做了尝试,这样做会引出一个问题,在程序未启动的情况下当手机刷卡时不会自动打开程序 如果想要自动打开需要按照上面这种写法,tech的个数可以根据你想要支持的卡类型进行调整
配置完成后,可以开始编写自己的Activity的java代码了
在onCreate方法中,需要获取NfcAdapter的引用,从名字可以看出这是一个适配器
NfcAdapter nfcAdapter; PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pos_main);
dc = (Button)findViewById(R.id.button4DC);
ecc = (Button)findViewById(R.id.button4ECC);
qpboc = (Button)findViewById(R.id.button4QPBOC);
logWindow=(TextView)findViewById(R.id.communication4Financy);
nfcAdapter=NfcAdapter.getDefaultAdapter(this);
pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getCla()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
onNewIntent(getIntent()); } 这里使用PendingIntent,该Intent与普通的Intent不同的是它是有一个延迟启动的功能,它启动时会回调onNewIntent函数,这样能够实现NFC与Activity的交互
pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getCla()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);的含义是将Intent传递给this Activity 在onPause与onResume中需要添加代码
public void onPause() {
super.onPause();
nfcAdapter.disableForegroundDispatch(this); }
public void onResume() {
super.onResume();
nfcAdapter.enableForegroundDispatch(this, pendingIntent, FILTERS, TECHLISTS); } enableForegroundDispatch的作用是,当NFC事件发生时如果当前Activity不是注册了NFC action-filter的Activity,手机会显示注册了NFC事件的Activity供用户选择
如果当前Activity注册了NFC action 则将事件优先交由当前Activity处理。 onNewIntent实现:
@Override public void onNewIntent(Intent intent) {
Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (p==null)
{
return;
}
Tag nfcTag = (Tag)p;
final IsoDep isodep = IsoDep.get(nfcTag); // final NfcA isodep = NfcA.get(nfcTag);
final byte[] cmd = { (byte) 0x00, // CLA Cla
(byte) 0xB4, // INS Instruction
(byte) 0x04, // P1 Parameter 1
(byte) 0x00, // P2 Parameter 2
(byte) 0x00, // Le
};
try {
isodep.connect();
byte[] reaponse=null;
logWindow.append(\"00B4040000\"+\'\\n\');
try {
reaponse = isodep.getHistoricalBytes();
logWindow.append(Util.bytes2HexString(reaponse)+\'\\n\');
reaponse =isodep.transceive(cmd);
logWindow.append(Util.bytes2HexString(reaponse)+\'\\n\');
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
try {
isodep.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } 首先需要获取Tag,Tag是操作NFC的基础
Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (p==null)
{
return;
}
Tag nfcTag = (Tag)p; 再将tag转换成特定的通讯协议 final IsoDep isodep = IsoDep.get(nfcTag); 连接读卡器: isodep.connect(); 获取历史字节:
reaponse = isodep.getHistoricalBytes(); 响应指令:
reaponse =isodep.transceive(cmd); 最后断开连接:(断开动作应该在Activity关闭或者pause的时候发生) finally{
try {
isodep.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} onNewIntent里面可以实现业务逻辑的处理以及UI
推荐第4篇:安卓应用开发教程WebView总结
本文由麦可网\"); 本地文件存放在:aets文件中
5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)
并重写其中的一些方法
shouldOverrideUrlLoading:对网页中超链接按钮的响应。
当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown(int keyCoder,KeyEvent event){
if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
webview.goBack(); //goBack()表示返回webView的上一页面
return true;
}
return false;
}
推荐第5篇:上海瑭锦安卓开发心得
上海瑭锦安卓开发心得
对于软件开发工程师来说学习C语言是一个必经得学习之路,因为他是编程语言中得基础,如果没有C语言得编写能力,那么就谈不上是软件开发工程师,所以学好C语言是成为软件开发工程师得基础,那么我们如何了解C语言呢?首先我们要知道C语言是汇编语言中最基础得编写语言,它集成了所有汇编语言得大部分优点,能实现低级语言得众多功能。
C语言把高级语言与低级语言相结合创造出自己得汇编语言风格,塑造出自己得汇编语言工作单元,C语言得结构特点是编写代码和相关数据可以分隔化除了程序和相关得必要信息保持彼此独立得关系,这种关系可以是我们编写得程序层次化更加清晰,更加便于使用、维护和调试,它会以给用户方便得调用功能,可以多元化、多种循环、控制编写语句得控制导向,从而使我们得编写程序更加结构化、实用化。
这些都可以让C语言实现决策目得得要求,C语言得应用指针特性使得其应用范围增加,应用面变大,增加了程序得安全性。不容易被恶意程序所利用,C语言得对其处理标准化、针对于编写函数得标记、多线程得支持、从新定义新得程序安全定义有了更多得广泛得选择。它得编写灵活和紧凑编写序列使得书写程序更加自由化,它可以直接访问我们常用得物理地址,简洁得使用操作使得用户在对硬件上得要求更加简洁,它可以移植%86得公共代码在相关得编写程序上,这一特性使得其在不同环境中运行。它得表达能力使得其在各种系统和相关运行环境下可以自由得发挥它得编写和使用得能力。
推荐第6篇:深圳安卓开发培训有没有用?
深圳安卓开发培训有没有用
庞大的市场意味着更大的挑战、更多的人才需求与就业机会,在现行教育模式下,高校计算机网络专业毕业生技术实力与企业雇主期望存在较大落差。面对竞争压力,只有通过不断提升自己的综合能力才可以在激烈的竞争中立于不败之地。深圳安卓开发培训的盛行之势显露无疑。
参加深圳安卓开发培训这个想法在上大学的时候就有了,一直没有机会去做,在人生感到绝望的时候,这是曾我的最后一条路,如果可以走下去,我便有了人生的道路。至于为什么是安卓开发培训,来之前培训的目的很简单,就是找到一份工作,一份糊口的工作而已,可是毕业之后,感觉当时的目的有些幼稚,在安卓开发培训学习,对我来说却是可以为自己的人生定位的一次契机。当你有在某领域有自己的长处时,你才能在这个领域走下去。
路是自己选的,所以自从我下定决心进行千锋安卓培训的第一天开始,我就对自己制定了目标,哪怕再苦再累自己也要扛着。上课的第一天我就被那里的老师们的专业技能和敬业程度深深震撼,老师会对每个知识点不厌其烦的重复。直到我们每个人都理解了为止,也正是从这个时候起我感到学校学到东西的肤浅。由于自己本来有一定的JAVA基础,所以虽然上课比大家迟了一周,但是在同学和老师的帮助下,我很快赶上了进度。惊奇的收获是,在这里的4个月敲的代码量竟然是我大学4年敲的代码的10倍。为了巩固每天的知识点,每天都有相应的课下练习,每天高强度的练习让自己在以后的工作中也
可以扛得住压力!在千锋学习了四个月的安卓开发培训,让我从一个编程的菜鸟,变成一名安卓开发人员,并顺利就业,也证实了千锋的雄厚实力。在这里我经历了JAVA语言、UI、网络、项目实践,最后是独立开发项目,每个阶段都必须通过考核,才能进入下一个阶段,而且每个阶段都有一位认证负责任的讲师陪我们度过。
高薪是我在深圳安卓开发培训第一天就下定决心的终极目标,接受自己的过去,打造一份优秀的简历是我必须完成的职业生涯课题第一课,多和就业老师沟通,不断优化自己的简历,同时,面试会存在着诸多的不顺,每一次的失败,都要去多多总结,反省,我开始相信并逐渐坚信,当我们能找到自己的不足并去弥补,上帝总会留下一扇窗是给你。
文章取材来自千锋深圳安卓培训学员的真实经历。
推荐第7篇:安卓实验报告
安卓实验报告
班级:学号:姓名:
xxxxx
11111111
xxxx
实验一:Activity生命周期的测试
一:实验目的
掌握使用Eclipse开发Android应用开发程序的方法; 掌握Android虚拟设备的创建方法; 了解Android的程序结构;
了解使用命令行创建Android程序方法;
了解Activity生命周期,理解Activity事件回调,onRestoreInstanceState()和 onSaveInstanceState两个函数的使用。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
(1)正常启动ActivityLife,然后单击用户界面的“结束程序”按钮关闭程序。
(2)正常启动ACtivityLife,然后通过“拨号键”启动内置的拨号程序,再通过“回 退建” 退出拨号程序,使ActivityLife重新显示在屏幕中。
四:实验核心代码
package com.example.activitylife;
import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.os.Build;
public cla MainActivity extends Activity { private static String TAG=\"LIFECYCLE\"; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); Log.i(TAG,\"(1) onCreate()\"); Button button =(Button) findViewById(R.id.btn_finish); button.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
// TODO Auto-generated method stub
finish();
} }); }
@Override
protected void onStart() { // TODO Auto-generated method stub
super.onStart(); Log.i(TAG,\"(2) onStart()\"); } @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState); Log.i(TAG,\"(3) onRestoreInstanceState()\"); } @Override
protected void onResume() { // TODO Auto-generated method stub
super.onResume(); Log.i(TAG,\"(4) onResume()\"); } @Override
protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub
super.onSaveInstanceState(outState); Log.i(TAG,\"(5) onSaveInstanceState()\"); } @Override
protected void onRestart() { // TODO Auto-generated method stub
super.onRestart(); Log.i(TAG,\"(6) onRestart()\"); } @Override
protected void onPause() { // TODO Auto-generated method stub
super.onPause(); Log.i(TAG,\"(7) onPause()\"); } @Override
protected void onStop() { // TODO Auto-generated method stub
super.onStop(); Log.i(TAG,\"(8) onStop()\"); } @Override
protected void onDestroy() { // TODO Auto-generated method stub
super.onDestroy(); Log.i(TAG,\"(9) onDestroy()\"); } } 五:运行结果截图:
实验二:用户界面——自我介绍
一:实验目的:
了解各种界面控件的使用方法;
掌握按键事件和触摸事件的处理方法;
掌握radioButton和radioGroup的使用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
要求写一个自我介绍的安卓应用,包括姓名,性别,爱好,其中性别用radioButton选项编写,点击提交时,姓名,性别,爱好会在下面显示出来。
四:实验核心代码:
public cla MainActivity extends Activity { private EditText editText1; private EditText editText2; private EditText editText3; private TextView textView1; private TextView textView2; private TextView textView3; private RadioGroup radioGroup; private RadioButton radioButton1; private RadioButton radioButton2; private Button button; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 = (EditText) findViewById(R.id.e1);
editText2 = (EditText) findViewById(R.id.e2);
textView1 = (TextView) findViewById(R.id.t1);
textView2 = (TextView) findViewById(R.id.t2);
textView3 = (TextView) findViewById(R.id.t3);
radioGroup = (RadioGroup) findViewById(R.id.RadioGroup1);
radioButton1 = (RadioButton) findViewById(R.id.RadioButton1);
radioButton2 = (RadioButton) findViewById(R.id.RadioButton2);
button = (Button) findViewById(R.id.button1);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(RadioGroup arg0, final int arg1) {
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
String str = editText1.getText().toString().trim();
String str1 = editText2.getText().toString().trim();
textView1.setText(\"姓名:\"+str);
textView3.setText(\"爱好:\"+str1);
if (arg1 == R.id.RadioButton1)
textView2.setText(\"性别:\"+\"男\");
else if (arg1 == R.id.RadioButton2)
textView2.setText(\"性别:\"+\"女\");
}
});
}
}); } } 五:运行结果截图:
实验三:不同界面的切换
一:实验目的
掌握各种界面布局的特点和使用方法;
掌握选项菜单,子菜单和快捷菜单的使用方法。
二;实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三;实验内容:
设计一个Tab标签页,实现LinearLayout,RelativeLayout,AbsoluteLayout三种分页面之间的切换,每个页面的内容包括用户名和确定,取消两个按钮
四:实验核心代码: AndroidMainfest.xml:
public cla MainActivity extends TabActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TabHost tabHost=getTabHost(); LayoutInflater.from(this).inflate(R.layout.tab1,
tabHost.getTabContentView(),true); LayoutInflater.from(this).inflate(R.layout.tab2,
tabHost.getTabContentView(),true); LayoutInflater.from(this).inflate(R.layout.tab3,
tabHost.getTabContentView(),true); tabHost.addTab(tabHost.newTabSpec(\"TAB1\").
setIndicator(\"线性布局\").setContent(R.id.layout01)); tabHost.addTab(tabHost.newTabSpec(\"TAB1\").
setIndicator(\"绝对布局\").setContent(R.id.layout02)); tabHost.addTab(tabHost.newTabSpec(\"TAB1\").
setIndicator(\"相对布局\").setContent(R.id.layout03)); } } Tab1,java public cla Tab1 extends Activity { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1); } }
Tab2.java public cla Tab2 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.tab2); } }
Tab3.java public cla Tab3 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.tab3); } }
五:运行结果截图:
实验四:登陆界面和广播消息
一:实验目的
了解使用Intent进行组件通信的原理; 了解Intent过滤器的原理与匹配机制;
掌握发送和接受广播消息的方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
先写一个登陆界面,包括用户名,密码,点击登陆时实现页面的跳转功能,在第二个页面使用Intent发送消息,并调用sendBroadcast()函数把Intent携带的消息传送出去,用BroadcastReceiver接受广播消息,在页面下方显示广播内容。
四;实验核心代码:
public cla MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button) findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent=new Intent(MainActivity.this,Second.cla);
startActivity(intent);
} }); } } public cla Second extends Activity { private Button button2; private EditText editText; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Intent intent=getIntent();
editText=(EditText) findViewById(R.id.e1);
button2=(Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent=new
Intent(\"com.example.broadcasttest.MY_BROADCAST\");
intent.putExtra(\"meage\", editText.getText().toString());
sendBroadcast(intent);
}
});
}
public cla MyBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent) {
String msg=intent.getStringExtra(\"meage\");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } }
android:name=\".Second\">
五:运行结果截图
实验五:Service绑定实现数据运算
一:实验目的
了解Service的原理和用途;
掌握本地服务的管理和方法; 掌握服务的隐式启动和显示启动方法;
掌握远程服务的绑定和调用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
以绑定方式使用Service,获取Service实例,当点击绑定服务时可以实现两个数的求差和比较大小功能,并输出结果,当点击取消绑定服务时,则无法运算。
四:实验核心代码
public cla MathService extends Service{ private final IBinder mBinder=new LocalBinder(); public cla LocalBinder extends Binder{ MathService getService(){
return MathService.this; } } public IBinder onBind(Intent intent) { Toast.makeText(this, \"本地绑定:MathService\",Toast.LENGTH_SHORT).show(); return mBinder; }
public boolean onUnbind(Intent intent){ Toast.makeText(this, \"取消本地绑定:MathService\", Toast.LENGTH_SHORT).show(); return false; }
public long sub(long a,long b){ return a-b; }
public int compare(long a,long b){ if(a>b) return 1; else if(a==b) return 0; else return -1;
} }
public cla MainActivity extends Activity { private MathService mathService; private Button button1; private Button button2; private Button button3; private Button button4; private EditText editText1; private EditText editText2; private EditText editText3; private boolean isBound=false; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText1=(EditText) findViewById(R.id.e1); editText2=(EditText) findViewById(R.id.e2); editText3=(EditText) findViewById(R.id.e3); button1=(Button) findViewById(R.id.but1); button2=(Button) findViewById(R.id.but2); button3=(Button) findViewById(R.id.but3); button4=(Button) findViewById(R.id.but4); button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(!isBound){
final Intent serviceIntent=new Intent (
MainActivity.this,MathService.cla);
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
isBound=true;
}
}
}); button4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { if(isBound){
isBound=false; unbindService(mConnection);
mathService=null; }
} });
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(mathService==null){
editText3.setText(\"未绑定服务\");
return ;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.sub(a1, b1);
String msg=String.valueOf(a1)+\"-\"+String.valueOf(b)+
\"=\"+String.valueOf(result);
editText3.setText(msg);
} });
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(mathService==null){
editText3.setText(\"未绑定服务\");
return ;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.compare(a1, b1);
if(result==1){
editText3.setText(a+\">\"+b);
}
else if(result==0){
editText3.setText(a+\"=\"+b);
}
else {
editText3.setText(a+\"
}
} }); } private ServiceConnection mConnection=new ServiceConnection() {
public void onServiceDisconnected(ComponentName arg0) {
mathService=null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
mathService=((MathService.LocalBinder)service).getService();
} }; }
实验六:SQLite实现用户的增删改查
一:实验目的
了解SQLite数据库的特点和体系及结构;
掌握SQLite数据库的建立和操作方法;
理解ContentProvide的用途和原理;
掌握ContentProvider的创建和使用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
使用SQlite数据库实现用户(包括:姓名,年龄,身高)的添加数据,全部显示,清除显示,全部删除,ID删除,ID查询,ID更新的功能。
四:实验核心代码
public cla MainActivity extends ActionBarActivity { private EditText et_name; private EditText et_sex; private EditText et_department; private EditText et_id; private EditText et_salary; private MyOpenHelper oh; private SQLiteDatabase db; private TextView tv; private LinearLayout ll; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, \"test.db\", null, 1);
db = oh.getWritableDatabase();
et_name = (EditText) findViewById(R.id.et_name);
et_sex = (EditText) findViewById(R.id.et_sex);
et_department = (EditText) findViewById(R.id.et_department);
et_salary = (EditText) findViewById(R.id.et_salary);
et_id = (EditText) findViewById(R.id.et_id);
ll = (LinearLayout) findViewById(R.id.ll); }
public void add(View v){
db = oh.getWritableDatabase();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(\"name\",name );
values.put(\"sex\", sex);
values.put(\"department\",department);
values.put(\"salary\", salary);
db.insert(\"staff\", null, values);
tv=new TextView(MainActivity.this);
tv.setText(\"添加成功\");
db.close(); } public void show(View v){
db = oh.getWritableDatabase();
Cursor cursor=db.query(\"staff\", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex(\"_id\"));
String name=cursor.getString(cursor.getColumnIndex(\"name\"));
String sex=cursor.getString(cursor.getColumnIndex(\"sex\"));
String department=cursor.getString(cursor.getColumnIndex(\"department\"));
String salary=cursor.getString(cursor.getColumnIndex(\"salary\"));
tv=new TextView(MainActivity.this);
tv.setText(\"ID:\"+id+\" ;\"+\"Name:\"+name+\" ;\"+\"Sex:\"+sex+\" ;\"+\"Department:\"+department+\" ;\"+\"Salary\"+salary);
ll.addView(tv);
}
db.close(); } public void clear(View v){
ll.removeAllViews(); } public void deleteAll(View v){
db = oh.getWritableDatabase();
db.delete(\"staff\", null, null);
tv=new TextView(MainActivity.this);
tv.setText(\"删除成功\");
db.close(); }
public void deleteById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
db.delete(\"staff\", \"_id=?\", new String[]{id});
db.close();
tv=new TextView(MainActivity.this);
tv.setText(\"ID删除成功\"); } public void findById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
Cursor cursor=db.query(\"staff\", null, \"_id=?\", new String[]{id}, null, null, null, null);
while(cursor.moveToNext()){
id=cursor.getString(cursor.getColumnIndex(\"_id\"));
String name=cursor.getString(cursor.getColumnIndex(\"name\"));
String sex=cursor.getString(cursor.getColumnIndex(\"sex\"));
String department=cursor.getString(cursor.getColumnIndex(\"department\"));
String salary=cursor.getString(cursor.getColumnIndex(\"salary\"));
tv=new TextView(MainActivity.this);
tv.setText(id+\";\"+name+\";\"+sex+\";\"+department+\";\"+salary);
ll.addView(tv);
tv=new TextView(MainActivity.this);
tv.setText(\"ID查询成功\");
}
db.close(); } public void updateById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(\"name\",name);
values.put(\"sex\", sex);
values.put(\"department\",department);
values.put(\"salary\", salary);
db.update(\"staff\", values, \"_id=?\", new String[]{id});
tv=new TextView(MainActivity.this);
tv.setText(\"更新ID成功\");
db.close(); } }
public cla MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version); }
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(\"create table staff(_id integer primary key autoincrement,name text,sex text,department text,salary float)\"); }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} }
五:运行结果截图
实验七:天气预报 一:实验目的
了解位置服务的概念;
了解地图密钥的申请方法;
掌握获取地理信息的方法;
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备( AVD)
三:实验内容
写一个项目,实现显示天气预报的用户界面,显示已发送SMS短信的用户界面,不同地区天气的转换
四:实验核心代码
package com.example.weather;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List;
import net.sf.json.JSONArray; import net.sf.json.JSONObject; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Meage; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;
import com.zy.bean.Sms; import com.zy.bean.Weather;
public cla MainActivity extends Activity { private MyConn conn = new MyConn();; private EditText et_city; private TextView tv_result; private ImageView iv_weather; private Handler handler; private Intent intent; private MyOpenHelper oh; private ServiceFunctions sFunctions; private MyArrayAdapter myArrayAdapter = null; private ListView lv; private int a = 1; private Weather weather; private List smsList = null;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, \"weatherdemo.db\", null, 1);
// System.out.println(\"数据库创建完\");
et_city = (EditText) findViewById(R.id.et_city);
tv_result = (TextView) findViewById(R.id.tv_result);
iv_weather = (ImageView) findViewById(R.id.iv_weather);
lv = (ListView) findViewById(R.id.lv);
// System.out.println(\"lv找到了\");
intent = new Intent(this, MyService.cla);
startService(intent);
Toast.makeText(MainActivity.this, \"服务启动\", 0).show();
bindService(intent, conn, BIND_AUTO_CREATE);
Toast.makeText(MainActivity.this, \"服务绑定\", 0).show();
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMeage(Meage msg) {
final Weather weather = (Weather) msg.obj;
tv_result.setText(weather.toString());
}
new Thread(new Runnable() { @Override public void run() {
// TODO Auto-generated method stub
try {
URL url = new URL(weather.getDayPictureUrl());
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
con.setRequestMethod(\"GET\");
if (con.getResponseCode() == 200) {
final Bitmap bitmap = BitmapFactory
.decodeStream(con.getInputStream());
runOnUiThread(new Runnable() {
}
@Override
public void run() {
// TODO Auto-generated method stub
iv_weather.setImageBitmap(bitmap);
}
}); }
} catch (Exception e) {
// TODO Auto-generated catch block e.printStackTrace(); }
}).start();
return false; } }); cla MyConn implements ServiceConnection {
@Override public void onServiceConnected(ComponentName name, IBinder service) { sFunctions = (ServiceFunctions) service; } @Override public void onServiceDisconnected(ComponentName name) {
} } cla MyArrayAdapter extends ArrayAdapter {
} public MyArrayAdapter(Context context, int resource,
int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); } public void saveWeather(View view) { if (a == 1) {
sFunctions.insertInfo(weather, oh);
a++; } else {
sFunctions.updateInfoById(\"1\", weather, oh); } Toast.makeText(MainActivity.this, \"保存天气信息成功\", 0).show(); } public void show(View view) { smsList = sFunctions.findAll(oh); if (smsList.size() >0) {
List sList = new ArrayList();
for (Sms sms : smsList) {
String s = sms.toString();
sList.add(s);
}
if (sList.size() >0) {
myArrayAdapter = new MyArrayAdapter(MainActivity.this,
R.layout.second, R.id.tv_show, sList);
lv.setAdapter(myArrayAdapter);
} } }
public void getWeather(View view) {
new Thread(new Runnable() {
String city = et_city.getText().toString();
@Override
public void run() {
try {
URL url = new URL(
\"http://api.map.baidu.com/telematics/v3/weather?location=\"
+ URLEncoder.encode(city)
+ \"&output=json&ak=QLZmpAbwFlWreQ28kLVgvKEC\");
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
con.setRequestMethod(\"GET\");
int code = con.getResponseCode();
if (code == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(con.getInputStream()));
JSONObject json = JSONObject.fromObject(reader
.readLine());
// System.out.println(obj.toString());
JSONArray array = json.getJSONArray(\"results\");
JSONObject obj = array.getJSONObject(0);
JSONObject weather_data = obj.getJSONArray(
\"weather_data\").getJSONObject(0);
weather = new Weather(obj.getString(\"currentCity\"), obj
.getString(\"pm25\"), weather_data
.getString(\"date\"), weather_data
.getString(\"weather\"), weather_data
.getString(\"wind\"), weather_data
.getString(\"temperature\"), weather_data
.getString(\"dayPictureUrl\"), weather_data
.getString(\"nightPictureUrl\"));
Meage msg = new Meage();
msg.obj = weather;
handler.sendMeage(msg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start(); } }
package com.example.weather;
import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper;
public cla MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version); }
@Override public void onCreate(SQLiteDatabase db) {
db.execSQL(\"create table sms(_id integer primary key autoincrement,sms_sender text,sms_body text,sms_receive_time text,return_result text)\");
db.execSQL(\"create table weatherinfo(_id integer primary key autoincrement,info text)\"); }
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
} }
package com.example.weather;
import java.util.List;
import android.app.Service; import android.content.Intent; import android.content.ServiceConnection; import android.os.Binder; import android.os.IBinder;
import com.zy.bean.Sms; import com.zy.bean.Weather;
public cla MyService extends Service { private ISmsDaoImpl daoImpl; private MyBinder myBinder = new MyBinder();
@Override public IBinder onBind(Intent intent) {
return myBinder; }
@Override public void unbindService(ServiceConnection conn) {
super.unbindService(conn); }
cla MyBinder extends Binder implements ServiceFunctions{
public long insertSms(Sms sms,MyOpenHelper oh) {
return MyService.this.insertSms(sms,oh);
}
public List findAll(MyOpenHelper oh) {
return MyService.this.findAll(oh);
}
public long insertInfo(Weather w,MyOpenHelper oh) {
return MyService.this.insertInfo(w,oh);
}
public int updateInfoById(String id, Weather w,MyOpenHelper oh) {
return MyService.this.updateInfoById(id, w,oh);
} }
public long insertSms(Sms sms,MyOpenHelper oh) {
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertSms(sms);
return id; }
public List findAll(MyOpenHelper oh) {
daoImpl=new ISmsDaoImpl(oh);
List smsList = daoImpl.findAll();
return smsList; }
public long insertInfo(Weather w,MyOpenHelper oh) {
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertInfo(w);
return id; }
public int updateInfoById(String id, Weather w,MyOpenHelper oh) {
daoImpl=new ISmsDaoImpl(oh);
int num = daoImpl.updateInfoById(id, w);
return num; } } 五:运行结果截图
推荐第8篇:安卓学习心得
Android学习心得
-----093380117
计算机应用(1)
张峰
1.关于Activity
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。 首先,我们增加一个新的资源描述layout/second.xml。
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。 2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setCla()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setCla的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
2.关于 Intent的使用
Intent分为两大类,显性的(Explicit )和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
3.组件(component),前面的例子中用的是setCla,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。
关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。
3.关于ListActivity
准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。
这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。
再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。
从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。
然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。
因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。 4.关于Dialog
注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。
很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。
看看另一个ProgreDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。
5.关于Service和Notification
大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方:
1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。
2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。
3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。
4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用标签来声明一个Service的访问权限,关于Android的安全问题也留待以后再解决吧。
6.GridView与ImageView
简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。
很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。
然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。
在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。
还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。
2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。 3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。 4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。
5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。
6.主线程默认的AsyncQueryHandler类的handleMeage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。
7.用户重写的onXXXComplete方法开始工作。
这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。
所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。
7.显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。
从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。
一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。
一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。
除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。
8.Intent消息传递
在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。
相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加项。这其实就相当于向系统的注册中心,注册了相关的Intent-filter和receiver(这个事情完全可以通过代码来做,只是这样就失去了修改的灵活性)。
当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)
恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Cla来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的cla属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。
但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。 从上面可以看出,Android的Intent可以添加上cla, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中cla是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。
Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。
9.ContentProvider数据模型
数据库操作
从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上, ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。 URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。
在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。 增删改查
ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = \"title\"这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。 insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。
但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。
最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。 数据模型
在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。
10.学习感想
通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。
推荐第9篇:安卓学习
安卓开发学习准备要点介绍
要说当下IT行业当中最具创造力、前瞻性、延续性和实现能力,想必有相当的人会把票投给Google的安卓,安卓开发学习也成为新潮流。安卓开发学习要做什么准备?下面就由福州卓跃教育具体介绍。
首先,最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程,只是很多同学在大学期间并没有好好学习,如果对它掌握的不太好或者很久没用了,建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行、调试它。如果没有学过,不妨也提前学习一下,可以参考清华大学出版社出版的谭浩强老师的《C语言程序设计》,推荐这本书的原因一是它已经经过了多年的考验,应该说还是比较严谨的;其次就是大部分的高校所开设的C语言使用的教材都是用它作为教材,因此无论是购买还是借阅,都容易找到。
其次,如果后续有志于游戏方面的开发,最好具备一定的数据结构和算法基础知识。虽然现代的高级编程语言中,其类库中已经帮我们实现了大部分的数据结构,一般情况下,我们直接使用即可。但如果能对其原理有所了解,当需要在这些数据结构和算法中间的时候,可以更加的清楚到底应该选择那个数据结构或者算法。另外,在图形图像处理上面,线性代数的作用也非常重要,如果能掌握一点这方面的基础知识,无疑也会在后续的学习中如虎添翼。举个例子,在Android中,有一个用于图形变换的类Matrix,用起来稍有点难。
第三,因为Android的应用的开发语言用的是Java语言,并且在Android中也用到了Java核心类库的大量的类,因此,在学习Android开发之前,可以先把Java基本语法和Java SE的基础类库好好学习一下Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。
至少要掌握以下两个方面的内容:a) Java基础语法:具体的知识点列表可以在这里下载:《Java知识点列表》V1.0。这部分内容没有讨价还价的余地,必须烂熟于胸。至于具体的学习方法,可以看书或者是看视频,但是关键是要多加练习,无论是书上的练习还是视频里面的练习,都需要仔仔细细的完成;b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多,一个一个的全部掌握,是不现实的,必须首先掌握面向对象的基础设计原则,有了这些基础原则的支持,就可以举一反三。这部分内容可以在《Effective Java》和《Agile.Software.Development:
Principles,Patterns.and.Practices》这两本书中找到。
推荐第10篇:物业部工作内容和岗位职责
物业经理工作内容和岗位职责
1、贯彻执行物业管理的各项法规、政策、标准,以及公司的各项规章制度;负责物业部全面工作并按物业服务合同的约定履行物业管理和服务的职能。
2、负责制定物业部的各项规章制度、工作计划及工作规程,合理调配、协调各岗位的分工与协作,各项服务工作应责任落到人;做好物业服务各项工作的日(周、季、年)检和不合格服务的处理,并做好各项工作记录。
3、全面了解辖区业主/租户的入住情况,带领下属做好物业管理费、水电费、停车费、租金、特约服务等费用的收缴工作,及时了解欠费情况和组织催收应收款项。每月向公司提交收费统计表,分折表等资料。
4、监督、检查、指导下属员工执行落实公司规章制度,审阅下属工作日记和作业记录,处理一般违纪行为;对下属的值班排班、考核、考勤及工作纪律、工作程序、服务质量等进行监督考评。每月考勤和考评表次月2号前交公司。
5、全面掌握统计物业及其配套设施及业主入住、装修、出租等情况,及时更新业主/租户联系表,收集、整理、汇总各类有价值的信息,建立建全业户档案及物业管理相关档案。
6、负责辖区业主房屋装修的查备,协调处理违章和投诉,落实安全和消防预控管理。
7、定期收集走访业户用户意见和建议,对服务工作质量进行跟踪回访,并反馈至相关部门改进工作;及时处理下属未能有效解决的投诉、突发事件,对超出能力外的问题立即向上级汇报,突发事件处理要多与上级反映,事后呈交书面报告。
8、负责与公司衔接工作,督促外包业务单位正常开展工作,履行相关合同(协议)约定的服务职能。
9、参加公司主持的会议,定期主持召开工作例会,总结工作的落实情况,讨论下步的工作计划。同时应关心员工生活,确保员工有良好精神面貌和积极工作态度。
10、完成公司交办的其他工作任务。设施设备主管工作内容和岗位职责
1、负责物业区域内所有建筑物及公共工作系统的日常管理、保养、维修工作,贯彻落实执行各项管理制度和技术规定,确保设施设备正常使用和安全运行。
2、掌握物业区域内房屋结构、设施设备种类和分布,各类管线走向和位置,并建档备查。建立建全设施设备台、帐、卡,并落实责任人。
3、负责物业及各设施设备日常使用、启动运行、维修保养情况的日巡查工作,发现问题要及时反映至相关部门予以处理。
4、安排下属工作任务及应急加班,检查督促下属员工遵守公司各种规章制度,并进行考勤、考核考评;观察、检查、引导下属各员的工作状态,帮助属下提高技能,贯输树立规范工作程序,掌握各设备故障出现的处理方法,并总结形成书面工作流程。
5、主审业户装修申请,并安排有关工程人员每天巡查一次装修的商户,确保无违章装修,并对违章行为予以制止,确保物业正常使用。对装修进行验收,签署书面意见。对装修资料予以建档、管理。
6、负责维修服务工作,安排下属在规定时间内完成,并及时反馈。
7、与市政、公用事业、水、电、气、电信等单位建立良好工作关系,确保故障发生时得到及时的支持配合。
8、与消防、电梯、智能等外包维修保养单位建立良好工作关系,负责协助现场作业的环境,及监督工作质量、进度,记录现场工作情况及检查结果,及协助办理按合同付款。
9、完成上级交办的其它任务。
客服主管工作内容和岗位职责
1、负责物业服务费、水电费、停车费、租金等费用的收缴、统计、核算工作,及时催收应收款项。对拖欠费用的业主,以电话联系,上门催收等方式,使拖欠款尽早收回。
2、收集走访业主意见和建议,对服务工作质量进行跟踪回访。
3、负责业主的投诉的接待工作,并做好记录及时通知反馈至相关部门;及时有效解决投诉、突发事件,对超出能力外的问题立即向上级汇报。
4、负责统计物业及其配套设施及业主入住、装修、出租等情况,及时更新业主/租户联系表,收集、整理、汇总各类有价值的信息,建立建全业户档案及物业管理相关档案。
5、监督、检查员工执行落实公司和服务处规章制度,处理一般违纪行为;对值班排班、考核、考勤及工作纪律、工作程序、服务质量等进行监督考评。
6、完成上级交办的其他任务。
保安主管工作内容和岗位职责
1、遵守有关法规和公司规章制度,全面负责保安日常管理,做好辖区安全和消防防范、公秩序维护和停车场管理等工作。
2、负责落实安全防范、消防工作和各项管理的有关规定及防范方法,组织学习安全、消防及事务程序,检查消防设施和灭火器材,要求每个员工正确使用各种灭火器材和掌握消防知识及救灾程序,并组织演练,保障消防系统处于良好状况,消防通道无堵塞。
3、传达完成上级安排的工作任务,协助公司招聘保安员。严格按公司规章制度、工作纪律、工作规程和标准、岗位职责等的有关规定,对下属队员采用定期民主考核考评,上报考评成绩;对不合格人员,提出惩罚,辞退的建议。
4、做好本部门员工考勤,请假,调休等工作,排出队员的值班表(每月25日前提交下月的),合理安排岗位及人员保证无缺岗。主持组织保安例会、月讲评会,传达公司各项管理规定,并整理记录会议情况、意见和存在的问题,及时向上级反映提出的问题。
5、负责解决处理下属不能解决的问题,协调解决业主/租户间的纠纷,协助上级处理各种违章行为。
6、接受公安、社区等部门的工作监督、指导,服务辖区内出现异常情况、突发事件,要及时赶到现场了解,处理控制事态恶化,减少损失,不能处理的及时报上级领导处理;安全案件要急时报公安机关,并就事件发生、处理的情况记录完。整
7、保安员所包含的工作内容和职责以及上级安排的其它工作任务和职责。 保洁主管工作内容和岗位职责
1、遵守公司各项管理制度,考勤制度和操作程序,绝对服从领导和上级的工作安排和检查,团结互助支持同事工作,在规定时间保质保量完成工作任务。
2、着装上岗,文明服务,礼貌待人,爱岗敬业不做有损公司形象的事,工作时间不做与工作无关的事情。
3、熟悉物业分布,楼层,车库、道路、人行道,绿化分布及面积,各种设施的位置,全面负责物业区域的环境卫生管理和清扫保洁工作。
4、制定日、周、月、季、年工作计划,工作内容,工作标准。合理配置人员实行分区划片作业管理,做到责任明确,划分清楚,不留卫生死角,考核标准公平。
5、以身作则,模范带头,每日巡查区域环境卫生清扫保洁工作情况、对下属工作进行指引、督导、对不合格的予以纠正。定期组织召开开班务会,关心员工生活,倡导在平凡的岗位上,干出不平凡的事迹。
6、负责消杀、大型开荒作业、灭四害、化粪池和排水井掏清等定期作业的计划实施。
7、严格执行工作检查制度,实行自查、互查、公司大检查等。
8、执行公司工具、材料的领用、使用、保养、更换、报废的方法和程序,清扫工具保管落实相应责任人、
9、接受业主、其他部门对清洁工作的意见和建议,提高作业水准;有效制止乱张贴、乱涂乱画、乱倒垃圾、乱吐痰等行为或现象。
10、完成上级领导交办的其他任务。
第11篇:客房主管岗位职责和工作内容
客房主管岗位职责:
[直系上级]:店长、店助
[直系下级]:客房领班、客房服务员
[岗位职责]:负责组织和安排客房和公共区域的清扫工作,督导、培训和考核下
属员工按标准和流程实施清扫和服务工作,确保酒店客房干净与设
施完好,满足客人的服务需求,并负责客房物品的管理,协助工程
人员完成客房和公共区域的维修项目。
[工作内容]:
1.每天安排客房服务员的工作,合理调配好人员使用。检查仪表仪容。
2.每天仔细检查每一间走客房,抽查住客房保证清洁质量及物品补充、摆放达
到要求、设施情况良好。
3.客房主管每天早上召开客房人员例会。
4.巡视公共区域,保持清洁、整齐、畅通及设施完好,排除安全隐患。
5.发现客房或公共区域的设施设备有故障,及时联系工程人员维修,检查维修
质量。
6.配合值班经理妥善处理客人的投诉,努力满足客人的要求。
7.制定客房设施设备保养计划、公共区域大清洁计划、客房计划卫生和安排灭虫除害工作。
8.负责客房服务用品、库房管理工作,物品按运营标准保证使用、消耗控制得
当。
9.做好棉织品的收发、送洗、交接等工作。
10.按要求管理好酒店制服,做好保管、发放、洗涤、申领等工作。
11.做好每月盘点及编制预算并制定用品申购计划。完成盘点明细表和物品申购表。
12.督导服务员按操作标准实施卫生工作,检查质量,做好服务员在岗培训和新
进服务员的岗位操作培训。
13.每天二次准确地填写房态表,及时交给值班经理。
14.负责楼层总钥匙和对讲机收发及保管。
15.负责清洁用品、用剂的发放和回收工作。指导客房服务员、安全使用和稀释。
16.联系和安排水箱清洁和灭虫除害工作。
17.关心员工,及时将员工的要求和想法反映给值班经理/店长。
18.写好每天的工作报告与做好交接工作。
19.做好每月的培训计划和实施,完成员工的每月质量考核评估,并做好记录。
20.完成上级指派的其它任务。
第12篇:值班经理岗位职责和工作内容
值班经理岗位职责和工作内容
值班经理岗位职责:
【岗位职责】:协助酒店经理或店长对宾客服务、质量控制、培训考核、日常经营、内部管
理等方面实施管理和服务工作。包含前台服务员的全部工作内容。
【工作内容】:
日常服务和经营管理工作:
1.包含前台服务员的全部工作内容。
2.总经理、店长不在酒店时,根据授权负责酒店运行管理;在客房主管和客房领班不在时,行使客房主管职责。
3.协助并指导前台服务员按标准完成各项工作任务。
4.检查员工日常工作中是否殷勤有礼、热情耐心、细致负责,仪表仪容是否达到酒店标准要求。
5.控制房态,达到收益最大化,并亲自处理需要特殊安排的订房事宜。并在销售中陪同宾客参观客房和简要介绍酒店。
6.掌握监控和酒店安全状况动态信息,发生安全和意外事件时,负责保护好现场,组织临时救护,立即报告总经理或店长。
7.主动征询和收集客人意见和建议。
8.根据宾客需求和情况变化,随时做好酒店内人员调配工作,确保对客服务质量。
9.加强财产管理和客用品管理,最大限度地减少物品损耗。
10.按规定数目抽查客房质量。
11.负责审核,对各类折扣审批权限、发票、转账单等凭证进行审核,并和实际房态及电脑账目核对,实施电脑夜审过账。
12.负责对各处交来的宾客遗留物品进行登记、保管、领取工作。
13.负责按照酒店各项应急方案,及时处理应急事件。
14.负责酒店日常巡视,确保质量,负责酒店灯光管理(大堂、走到等)。
15.按规范做好交接班工作,并及时落实交接工作。
16.完成上级指派的各项工作。
行政管理工作:
按照总经理或店长指派分工,完成相关的行政管理工作。
1.负责前台客用印刷品、客用品、大堂所有设施设备的管理工作。及时补充前台消耗品和保修损坏设施。每月对前台进行盘点及编制预算,制作相应报表交总经理或店长审核。
2.负责根据业务情况和人员配备,每月汇总和审核编排的排班和考勤,并填写相应的排班明细表和考勤汇总表交总经理或店长。
3.负责按时限要求对中宾登记单、临时住宿登记表、预订单、团队名单等客史资料和转账单等表单完整的归类、装订、分期保管。
4.对消防器材和安全设施定期检查,做好监护工作,确保器材可用。
5.根据总经理或店长的要求和分工,组织实施相关服务规范的日常培训和督导工作。
第13篇:1前厅岗位职责和工作内容
前厅培训一培训时间:8月19号下午17:00分
前厅岗位职责和工作内容
直属上司:前厅主管
岗位职责:为宾客提供接待、预定、问询、结账等手续。提供主动、热情、耐心、细致、准确、高效的服务,严格执行酒店各项服务标准,努力树立酒店良好的品牌和公众形象。
工作内容:
1.为散客、团队办理入住登记手续,发放房卡。
2.随时准确掌握和了解客房状态、价格等信息,积极有效地推销客房。
3.负责办理客房的换房手续。
4.做好宾客资料的保密工作,不得随意泄露客人隐私。
5.做好传真的收发、预定确认工作。
6.负责办理宾客的离店结账手续。
7.向宾客介绍会员卡制度,出售会员卡,并按会员制度办理会员入住手续。
8.随时熟知当班预定状况,负责散客(电话、上门、网络、协议)的预定服务。
9.负责酒店促销活动和停电、停水、无网络等临时发生事件的解释工作.
10.为宾客提供物品租用服务。、
11.为宾客提供行李、物品寄存服务。
12.正确地接待宾客问询、提供有关交通、旅游景点、娱乐购物、医院、银行、餐馆、及其他酒店
等各类信息。
13.负责前台卫生保洁及设备设施的维护工作。
14.为宾客提供叫醒服务
15.做好物品交接与盘点。
16.耐心接受宾客投诉,并及时向上级报告宾客意见和诉求,同时做好投诉及处理过程记录。
17.负责访客查询工作,办理访客登记手续。不得把住店宾客资料轻易泄露。
18.做好宾客遗留物品的登记、保管和核对归还工作。
19.做好交接班工作。交接班工作确认无误后交班人方可下班。
20.积极参加酒店和公司组织的各类培训活动。
21.负责按规定程序提供开门服务。
22.按规定开展催账工作。
23.房卡、固定物品的保管,以及客人房卡收发和寄存的工作。
24.按规定的程序核对房态和房账,发现差异及时更正。
25.负责接受酒店设施设备的保修工作,并及时报告相关领导。
26.按标准及时准确地将入住宾客信息输入电脑,按规定向公安部门传送中外宾信息。及时进行宾
客退房处理。
27.熟悉酒店安全有关规范,做好可疑宾客的监控,发现问题及时报告。
28.做好员工间的协作工作,完成上级指派的其他工作。
第14篇:采购助理岗位职责和工作内容
采购助理岗位职责和工作内容
1、协助采购经理对正常库存产品进行日常采购补货;
2、按照公司的新品采购计划进行采购询价,采购比价,引进新品,牵头与其他部门配合做好新品的业务接洽、业务培训等工作
3、每周定期汇报采购情况,上交采购汇总和明细表,拟定采购资金计划表
4、协助公司运营部门进行产品业务分析,拟定新品采购计划,淘汰产品清单,滞销产品处理清单以及;
5、整理供货厂商资料档案,协助公司运营部门主持拟定采购合同
6、其他与采购有关的工作,以及公司交代的其他工作事项。
第15篇:客房主管岗位职责和工作内容
客房主管岗位职责: [直系上级]:店长、店助
[直系下级]:客房领班、客房服务员
[岗位职责]:负责组织和安排客房和公共区域的清扫工作,督导、培训和考核下属员工按标准和流程实施清扫和服务工作,确保酒店客房干净与设施完好,满足客人的服务需求,并负责客房物品的管理,协助工程人员完成客房和公共区域的维修项目。
[工作内容]:
1.每天安排客房服务员的工作,合理调配好人员使用。检查仪表仪容。 2.每天仔细检查每一间走客房,抽查住客房保证清洁质量及物品补充、摆放达到要求、设施情况良好。
3.客房主管每天早上召开客房人员例会。
4.巡视公共区域,保持清洁、整齐、畅通及设施完好,排除安全隐患。5.发现客房或公共区域的设施设备有故障,及时联系工程人员维修,检查维修质量。
6.配合值班经理妥善处理客人的投诉,努力满足客人的要求。
7.制定客房设施设备保养计划、公共区域大清洁计划、客房计划卫生和安排灭虫除害工作。8.负责客房服务用品、库房管理工作,物品按运营标准保证使用、消耗控制得当。
9.做好棉织品的收发、送洗、交接等工作。
10.按要求管理好酒店制服,做好保管、发放、洗涤、申领等工作。11.做好每月盘点及编制预算并制定用品申购计划。完成盘点明细表和物品申购表。 12.督导服务员按操作标准实施卫生工作,检查质量,做好服务员在岗培训和新进服务员的岗位操作培训。
13.每天二次准确地填写房态表,及时交给值班经理。14.负责楼层总钥匙和对讲机收发及保管。
15.负责清洁用品、用剂的发放和回收工作。指导客房服务员、安全使用和稀释。 16.联系和安排水箱清洁和灭虫除害工作。
17.关心员工,及时将员工的要求和想法反映给值班经理/店长。18.写好每天的工作报告与做好交接工作。
19.做好每月的培训计划和实施,完成员工的每月质量考核评估,并做好记录。20.完成上级指派的其它任务。
第16篇:何避免安卓开发学习中的弯路
何避免安卓开发学习中的弯路
最初参加安卓开发培训是因为公司安排,想通过有规律的学习来提升安卓开发能力,也是因为避免自学安卓开发中的弯路。
本人在学习安卓开发培训的这期间,感觉学到的远比自己自学一年时间,所学习到的、了解到的要多很多,也收获了很多人脉。
首先,自学的时候没有方向性、没有目的性,这种看到哪个知识点就去学习那方面知识点的方式,在一定程度上造成学习的事倍功半;而在在安卓开发培训的课堂上,则明确设置了学习方向,由浅显入深,循序渐进;
第二,自学的时候遇到问题除了百度或谷歌外,别无他法;而在安卓开发培训学习,除了百度或谷歌外,还有一批优秀的、经验丰富的培训师可以咨询,这样就可以避免自己的学习陷入死循环;
第三,自学的时候随意性比较大,没有时间上的观念,想学就学一下,不想学就丢一边,特别是在学习过程中遇到难题的时候;而在安卓开发培训学习的话,则有良好的时间安排,一方面既保证了足够的学习时间,另一方面又保证了自我钻研时间;
第四,自学的时候不会想着自己要去做某些项目;但当你身处安
卓开发培训的课堂上,就会在你阶段性的学习过程中要求你独立完成具有某些功能的项目,这样就能更快,更全面的掌握技能,从而更有助于加深对安卓开发技能方面的理解。
选择千锋安卓开发培训机构,起初是因为公司经过多家机构的筛选和比较,了解到千锋的讲师背景、学习氛围、课程体系在业内都是名列前矛,加之口碑非常好,所以选择了千锋这家培训机构。
以上只是针对我一个过来人,对于自己学习安卓开发培训的四个月的真实领悟和总结,想对以后想要加入安卓开发学习的朋友们提供一些有用的建议吧!
第17篇:安卓程序开发程序员培训的真实经历
安卓程序开发程序员培训的真实经历
大学毕业后,四年中的苦与乐都伴随着毕业的铃声而渐渐远去。毕业2年多之后,我辗转过2个行业,慢慢的,开始对自己的职业方向产生怀疑,看到和自己的同窗之间渐行渐远,渐渐找不到自己的方向,我开始陷入迷惘。偶然的机会,和同事们交流了解到安卓程序开发程序员培训,和安卓手机现在巨大的发展空间,并通过自己的了解和朋友的介绍,我发现这个行业是真正适合我的方向! Android 是一个年轻的、有待开发的平台,它有潜力同时涵盖移动电话的两个不同消费群体,甚至可能缩小工作和娱乐之间的差别。于是,我毅然决定辞去原本还不错的工作,跟我的一个哥们从南方的家乡来到遥远的北京。我要来一次:重走青春!
初来到千锋学习安卓,感受到了与自学安卓程序开发不同的温馨和暖意。授课老师不仅给你传授专业的安卓程序开发程序员培训所要掌握的必备知识,而且课后会经常和同学们沟通和交流,并鼓励和引导大家更好的学习。经过了几个月的培训,我们和老师建立了深厚的友谊。老师每天开始上课前,会先复习前一天的知识,做到温故而知新。然后结合实例,现场演示教授当天的知识。并在课后留下相关的练习,让我们课后更好的消化和吸收。经过了复习,讲解和练习的过程,对知识有了更深的理解。在经过每个阶段性学习之后,是项目实战。我觉得这是个人能力提高最快的时候。老师会给予真实的项目开发文档和案例,采用小组分配的方式,充分调动每一位学员的思考和动手能力,真实体会公司实际的开发场景。
除了自己的坚定选择,最需要感谢的就是这里的老师和课程体系,还有我可爱的朝夕相处过共同为了安卓程序开发而拼搏过的同窗们。
我能有今天的一份成绩,站在这样的一个位置,不只是薪资,也不仅仅是在安卓程序开发程序员培训机构学习的短短四个月就能决定的这一切。更主要的是收获了属于自己的一个平台,认识了更多的朋友,让我有能去挑战移动互联网,成为一名真正的安卓程序开发程序员,并能在安卓程序开发的路上,开创属于自己人生中的新起点。
在这里,勤奋的人们开始了更加勤奋的对目标的追逐。逐渐的,我从一个对android程序开发的初窥,到学会再到深入理解和掌握,继而赢得一次次反思,每一次都是不断的充实自己的过程。在这里学习android程序开发程序员培训的过程中是苦并快乐的,每当解决了一个新的问题,就感觉离自己的梦想又近了一步,也对android程序开发又多了一个更深层次的理解。
第18篇:[安卓开发] Broadcast 三种广播的使用总结
[安卓开发] Broadcast 三种广播的使用
总结
1、什么是安卓的Broadcast?
安卓的四大组件之一,是一种广泛应用在应用程序之间传输信息的机制。
2、什么是安卓的BroadcastReceiver?
是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。例如系统的广播有开机广播: 系统在开机时候会发送开机广播,程序接收到之后,能进行开机自启动。 网络状态改变广播: 3g变wifi、网络断开等。电量改变广播等等。。。
3、Anroid为什么要这样设计?
大大减少开发工作量和开发周期
作为开发者,只需要掌握BroadcastReceiver
4、怎么理解Broadcast和BroadcastReceiver ?
Broadcast就像现实中的广播电台,他发广播信号来,然后我们用收音机来接收,然后处理,并且播放出声音, BroadcastReceiver就相当于那台收音机。
5、使用方法
发送:
把信息装入一个Intent对象(如:Action、Category),通过调相应的方法将Intent对象以广播的方式发送出去: sendBroadcast();
sendOrederBroadcast(); sendStickyBroadcast(); 接收:
当Intent发送之后,所有已经注册receivedBroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceiver()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceiver()方法。 注意:
BroadcastReceiver需要注册
静态注册
代码动态注册
6、注意!!!!
BroadReceiver生命周期只有十秒左右,不能直接执行耗时操作,不然会出现ANR(应用程序无响应),也不能用子线程来做,因为每次广播来的时候都会创建一个Reveiver对象,并且调用onReceiver,执行完之后 ,对象会立刻被销毁,子线程也没了
要做耗时操作的话,应该通过发送Intent给Service,由Service来完成。
动态注册广播接受者的话要在Destory回调事件进行unregister
7、广播的分类
普通广播 (Normal broadcast) 所有监听该广播接受者都可以监听到该广播 同级别接收先后顺序是随机的(无序) 级别低的后收到广播
接收器不能截断广播的继续传播,也不能处理广播 同级别动态注册高于静态注册 有序广播 (Oredered broadcast) 按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大优先级越高,可以终止广播的继续传播,接受者可以修改intent的内容。 同级别接收顺序是随机的 级别低的后收到
能截断广播的继续传播,高级别的广播接收器接收广播后能决定时候截断。 能处理广播
同级别动态注册高于静态注册
异步广播 (粘滞性滞留广播) ps:已被弃用
不能处理结果给下一个接收者,无法终止广播。 一直存在
可以先发送广播,再注册接收器
需要在清单文件添加android.permiion.BROADCAST_STICKY权限
8、Demo
布局actibity_main三个按钮:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
android:layout_width=\"match_parent\"
android:layout_height=\"match_parent\"
android:orientation=\"vertical\">
android:id=\"@+id/bt_one\"
android:layout_width=\"match_parent\"
android:layout_height=\"50dp\"
android:text=\"普通广播\" />
android:id=\"@+id/bt_two\"
android:layout_width=\"match_parent\"
android:layout_height=\"50dp\"
android:text=\"有序Ordered广播\" />
android:id=\"@+id/bt_three\"
android:layout_width=\"match_parent\"
android:layout_height=\"50dp\"
android:text=\"异步广播Sticky粘滞性滞留广播\" />
MainActivity.Java
public cla MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btOne;
private Button btTwo;
private Button btThree;
MyReiceiverThree myReiceiver = new MyReiceiverThree();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btOne = (Button) findViewById(R.id.bt_one);
btTwo = (Button) findViewById(R.id.bt_two);
btThree = (Button) findViewById(R.id.bt_three);
btOne.setOnClickListener(this);
btTwo.setOnClickListener(this);
btThree.setOnClickListener(this);
//动态注册,在当前activity的生命周期內运行
/*IntentFilter filter= new IntentFilter(Config.BC_ONE_ACTION);
MyReiceiver myReiceiver = new MyReiceiver();
registerReceiver(myReiceiver,filter);*/
}
@Override
public void onClick(View view) {
Intent intent = new Intent();
switch (view.getId()){
case R.id.bt_one:
//发送普通广播
intent.setAction(Config.BC_ONE_ACTION);
intent.putExtra(\"msg\",\"这是普通广播\");
sendBroadcast(intent);
break;
case R.id.bt_two:
//有序广播
intent.setAction(Config.BC_TWO_ACTION);
intent.putExtra(\"msg\",\"这是有序广播\");
sendOrderedBroadcast(intent,null); //其中第二个参数是设置权限,即接收器必须具有相应的权限才能正常接收到广播。
break;
case R.id.bt_three:
//异步广播
intent.setAction(Config.BC_THREE_ACTION);
intent.putExtra(\"msg\",\"这是异步广播\");
sendStickyBroadcast(intent);
//可以先发送 后注册
IntentFilter filter = new IntentFilter(Config.BC_THREE_ACTION);
registerReceiver(myReiceiver, filter);
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReiceiver);
} }
MyReceiver.java
public cla MyReiceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取处理的的广播,普通广播不能获取处理
//true代表如果前面的接收器没有存放数据,则自动创建一个空的Bundle对象,false则表示如果前面的接收器如果没有存放任何数据则返回null。
Bundle bundle= getResultExtras(true);
System.out.println(\"接收器1接收到处理的值:\"+bundle.getString(\"msg\"));
System.out.println(\"接收器1:\"+intent.getStringExtra(\"msg\"));
} }
MyReceiverTwo.java
public cla MyReiceiverTwo extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context,intent.getStringExtra(\"msg\"),Toast.LENGTH_SHORT).show();
System.out.println(\"接收器2:\"+intent.getStringExtra(\"msg\"));
abortBroadcast();
//截断广播,不让别的接收器继续接收,有序广播才能成功拦截
//处理广播
Bundle bundle = new Bundle();
bundle.putString(\"msg\",\"处理过后的广播\");
setResultExtras(bundle); //
} }
MyReceiverThree.java
public cla MyReiceiverThree extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context,intent.getStringExtra(\"msg\"),Toast.LENGTH_SHORT).show();
System.out.println(\"接收器3:\"+intent.getStringExtra(\"msg\"));
} }
Config.java
public cla Config {
public static final String BC_ONE_ACTION = \"com.example.testbroadcasetwo.bcone\";
public static final String BC_TWO_ACTION = \"com.example.testbroadcasetwo.bctwo\";
public static final String BC_THREE_ACTION = \"com.example.testbroadcasetwo.bcthree\"; }
Androidmanifest.xml
<?xml version=\"1.0\" encoding=\"utf-8\"?>
package=\"com.example.testbroadcasetwo\">
//异步广播需要 一个权限
android:allowBackup=\"true\"
android:icon=\"@mipmap/ic_launcher\"
android:label=\"@string/app_name\"
android:supportsRtl=\"true\"
android:theme=\"@style/AppTheme\">
String msg = intent.getStringExtra(\"msg\");
iShowView = (MainActivity) context;
if (action.equals(Config.BC_ONE)) { //接收到普通广播
iShowView.updateText(msg);
//回调给HandleBroadcast
}
}
public void setiShowView(IShowView iShowView) {
this.iShowView = iShowView;
} }
IShowView.java 回调到activity更新ui的接口
public interface IShowView {
void updateText(String msg); }
MainActivity.java
publicclaMainActivityextendsAppCompatActivityimplements View.OnClickListener,IShowView{
private Button btOne;
private TextView mTvResult;
//p层,处理数据
private HandleBroadcast handleBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handleBroadcast = new HandleBroadcast(this,this);
btOne = (Button) findViewById(R.id.bt_one);
mTvResult = (TextView) findViewById(R.id.tv_result);
btOne.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt_one:
handleBroadcast.sendMyBroadcast(TYPE.NORMAL);
break;
}
}
/**
* 广播接收处理完毕之后回调更新ui
* @param msg 要显示的文字
*/
@Override
public void updateText(String msg) {
mTvResult.setText(msg);
} }
activity_main.xml
<?xml version=\"1.0\" encoding=\"utf-8\"?>android:layout_width=\"match_parent\"
android:layout_height=\"match_parent\"
android:orientation=\"vertical\">
android:id=\"@+id/bt_one\"
android:layout_width=\"match_parent\"
android:layout_height=\"50dp\"
android:text=\"发送广播\"
/>
android:id=\"@+id/tv_result\"
android:layout_width=\"match_parent\"
android:layout_height=\"60dp\"
android:text=\"结果\"
android:gravity=\"center\"
/>
第19篇:安卓初级程序员
1、数学、物理、计算机相关专业本科学历;
2、熟悉计算机体系结构及计算机网络体系结构,了解c,c++或Java\\J2ME其中一种语言;
3、对软件有较大兴趣,了解面向对象思维,有较强的逻辑思维能力及问题的解决能力;
4、熟悉linux系统编辑环境、测试流程;
5、熟悉TCP/IP、HTTP协议,有操作系统的基础知识;Oracle、MySQL、sqlserver等数据库中至少一种;
6、有较强的沟通能力,并能主动的向上级汇报工作中出现的问题;
职位描述:
-负责公司Android项目的软件开发
职位要求:
-扎实的JAVA语言基础
-计算机相关专业本科学历
-具有较好的英文读写能力
-有移动平台开发经验的优先
-一年以上Android手机开发经验
岗位描述返回公司简介 3000-3500元
1、数学、物理、计算机相关专业专科或以上学历;
2、熟悉计算机体系结构及计算机网络体系结构,了解c,c++或Java\\J2ME其中一种语言;
3、对软件有较大兴趣,了解面向对象思维,有较强的逻辑思维能力及问题的解决能力;
4、熟悉linux系统编辑环境、测试流程;
5、熟悉TCP/IP、HTTP协议,有操作系统的基础知识;Oracle、MySQL、sqlserver等数据库中至少一种;
6、有较强的沟通能力,并能主动的向上级汇报工作中出现的问题;
软件测试
岗位职责/待遇/环境:
1、根据开发进度和任务分配,完成相应模块软件的测试任务;
2、进行编制项目文档和质量记录的工作;
3、能准确提出和定位软件缺陷;
4、能胜任回归测试的工作;
5、能与开发人员及产品人员有效沟通协作;
6、按时向上级汇报测试进度状况和数据。
录用流程:投递简历--初试笔试--录用签订就业协议--内部实训--上岗
工作地点:本职位工作地点在天津和北京
岗位要求:
1、计算机、通信、电子、数学等相关专业或者热爱编程,大学专科或以上学历;
2、熟悉Web产品测试,熟悉B/S架构;
3、熟悉软件功能测试和兼容性测试;
4、熟悉软件开发的过程,有面向对象的软件开发思想;
5、对主流数据库如oracle/mysql/sqlserver有一定了解;
6、有较强的沟通能力和独立思考能力,工作细致;
7、具有高度的责任心和敬业精神,良好的团队合作精神。
录用流程:投递简历--初试笔试--录用签订就业协议--内部实训--上岗 工作地点:本职位工作地点在天津和北京
第20篇:安卓手机培训
安卓系统:
简介:Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread和Android 3.0 Honeycomb。
系统介绍:
Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。
2010年末数据显示,仅正式推出两年的操作系统Android已经超越称霸十年的诺基亚(Nokia)Symbian OS系统,采用Android系统主要手机厂商包括宏达电子(HTC)、三星(SAMSUNG)、摩托罗拉(MOTOROLA)、LG、Sony Ericon、魅族M9等,使之跃居全球最受欢迎的智能手机平台,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。
发展方向:1.开放性 2.挣脱运营商的束缚 3.发展成有更丰富的硬件选择
主要特性:
升硬件速度
更多屏幕以及分辨率选择
大幅度的用户界面改良
支持 Exchange活动墙纸
大幅改进虚拟键盘
蓝牙 2.1
Google 地图 3.1.2
相对于上一版本的 改变:
1、整体性能大幅度的提升
2、3G网络共享功能。
3、Flash的支持。
4、App2sd功能。
5、全新的软件商店。
6、更多的Web应用API接口的开发
安卓系统的优势:
一、开放性
在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。
开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么
功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。
三、丰富的硬件选择
这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。
四、不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。
安卓上网设置:
中国移动上网、彩信设置
GPRS设置
名称:GPRS连接互联网
APN: cmnet
代理:
端口:
用户名:
密码:
服务器:
MMSC:
彩信代理:
彩信端口:
彩信协议:WAP 2.0
MCC:460
MNC:00(保持默认值,不要更改,有的机器是02)*
身份验证类型: (提示身份验证错误的,可以试试选择pap or chat) 接入点名称类型:default
!编辑完以后,按『MENU』选择 “保存”。
彩信设置
名称:中国移动彩信设置
APN:cmwap
代理:10.0.0.172
端口:80
用户名:
密码:
服务器:
彩信代理:10.0.0.172
彩信端口:80
彩信协议:WAP 2.0
MCC:460
MNC:00(保持默认值,不要更改,有的机器是02)*
身份验证类型:
接入点名称类型:mms
!编辑完以后,按『MENU』选择 “保存”。
!1.Cmnet设置完成后,把APN列表界面中此项对应的圆点选点为绿色(这一步一定要做) !2.进入电话拨号状态,输入: *#*#4636#*#* ,输入完毕会自动呼出手机信息设置。点击左下角的切换DNS检查按钮,使按钮旁边显示:0.0.0.0 allowed
!3.勾选上无线和网络设置中的移动网络,状态栏会出现 E和上下箭头的标志。 ------------------------------
中国联通上网、彩信设置
联通的APN设置
名称:3gnet
APN:3gnet
代理:
端口:
用户名:
密码:
服务器:
MMSC:
彩信端口:80
彩信协议:WAP 2.0
MCC:460
MNC: 01(保持默认值,不要更改,有的机器是00)
APN类型:default
彩信设置
首页-MENU-设置-无线控制-移动网络设置-接入点名称-MENU-新APN
名称:3gwap
APN:3gwap
代理:10.0.0.172
端口:80
用户名:空
密码:空
彩信端口:80
彩信协议:WAP 2.0
MCC:460
MNC: 01(保持默认值,不要更改,有的机器是00)
APN类型:mms
安卓软件的安装:
Android手机软件的安装
通过电脑用91助手来安装程序
1、安装91手机助手:下载91手机助手,下载完成后双击图标并根据提示进行安装。
2、连接识别手机:用数据线将手机和计算机相连接,打开91手机助手,此时计算机屏幕会提示安装守护程序,点击下一步进行安装。安装完成之后手机助手就会识别到手机。
3、下载需要安装的程序
4、打开91助手之后进入找到程序管理—》安装软件—》选择第二步完成下载的那些软件
通过SD卡(内存卡)来安装软件
先看手机上面有没有一个文件管理的文件夹如果有进行一下操作
1.把sd卡放到读卡器上,插到电脑。
2.把下载好的文件拷贝到内存卡上的文件夹内,要记住文件名待会要通过手机去找到这个
文件夹
3.把内存卡放入手机开机,通过上面所说的文件管理在手机里找到刚才拷贝软件进去的文
件夹的文件
4.打开程序提示安装,根据提示一步步安装
通过数据线安装软件
先看手机上面有没有一个文件管理的文件夹如果有进行一下操作
5.把手机通过数据线与电脑连接。
6.把下载好的文件拷贝到内存卡上的文件夹内,要记住文件名待会要通过手机去找到这个
文件夹
7.把内存卡放入手机开机,通过上面所说的文件管理在手机里找到刚才拷贝软件进去的文
件夹的文件
8.打开程序提示安装,根据提示一步步安装
Android手机与其他手机通讯录互导
Vcard
把电话号码以Vcard的格式手机上导出来,然后再以Vcard的格式在导入到手机
号簿管家
在手机上下载号簿管家的软件,然后通过软件备份电话号码到号簿管家上面,备份好后,只要是可以安装号簿管家的手机,都可以从号簿管家上导出来到手机上了。
QQ同步助手
在手机上下载QQ同步助手的软件,然后通过软件备份电话号码到QQ同步助手上面,备份好后,只要是可以安装QQ同步助手的手机,都可以从QQ同步助手上导出来到手机上了。 HTC刷机包