安装指定apk
public void setupAPK(String apkname){
String fileName = Environment.getExternalStorageDirectory() + "/" + apkname;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
mService.startActivity(intent);
}
进入联系人页面
1.Intent intent = new Intent();
2.intent.setAction(Intent.ACTION_VIEW);
3.intent.setData(People.CONTENT_URI);
4.startActivity(intent);
查看指定联系人
1.Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID
2.Intent intent = new Intent();
3.intent.setAction(Intent.ACTION_VIEW);
4.intent.setData(personUri);
5.startActivity(intent);
显示网页:
1. Uri uri = Uri.parse("http://www.google.com");
2. Intent it = new Intent(Intent.ACTION_VIEW,uri);
3. startActivity(it);
显示地图:
1. Uri uri = Uri.parse("geo:38.899533,-77.036476");
2. Intent it = new Intent(Intent.Action_VIEW,uri);
3. startActivity(it);
路径规划:
1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
2. Intent it = new Intent(Intent.ACTION_VIEW,URI);
3. startActivity(it);
拨打电话:
调用拨号程序
1. Uri uri = Uri.parse("tel:xxxxxx");
2. Intent it = new Intent(Intent.ACTION_DIAL, uri);
3. startActivity(it);
1. Uri uri = Uri.parse("tel.xxxxxx");
2. Intent it =new Intent(Intent.ACTION_CALL,uri);
3. 要使用这个必须在配置文件中加入<uses-permission id="android.permission.CALL_PHONE" />
发送SMS/MMS
调用发送短信的程序
1. Intent it = new Intent(Intent.ACTION_VIEW);
2. it.putExtra("sms_body", "The SMS text");
3. it.setType("vnd.android-dir/mms-sms");
4. startActivity(it);
发送短信
1. Uri uri = Uri.parse("smsto:0800000123");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. it.putExtra("sms_body", "The SMS text");
4. startActivity(it);
发送彩信
1. Uri uri = Uri.parse("content://media/external/images/media/23");
2. Intent it = new Intent(Intent.ACTION_SEND);
3. it.putExtra("sms_body", "some text");
4. it.putExtra(Intent.EXTRA_STREAM, uri);
5. it.setType("image/png");
6. startActivity(it);
发送Email
1.
2. Uri uri = Uri.parse("mailto:xxx@abc.com");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
4. it.setType("text/plain");
5. startActivity(Intent.createChooser(it, "Choose Email Client"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"me@abc.com"};
3. String[] ccs={"you@abc.com"};
4. it.putExtra(Intent.EXTRA_EMAIL, tos);
5. it.putExtra(Intent.EXTRA_CC, ccs);
6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");
7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
8. it.setType("message/rfc822");
9. startActivity(Intent.createChooser(it, "Choose Email Client"));
添加附件
1. Intent it = new Intent(Intent.ACTION_SEND);
2. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
3. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
4. sendIntent.setType("audio/mp3");
5. startActivity(Intent.createChooser(it, "Choose Email Client"));
播放多媒体
1.
2. Intent it = new Intent(Intent.ACTION_VIEW);
3. Uri uri = Uri.parse("file:///sdcard/song.mp3");
4. it.setDataAndType(uri, "audio/mp3");
5. startActivity(it);
1. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
Uninstall 程序
1. Uri uri = Uri.fromParts("package", strPackageName, null);
2. Intent it = new Intent(Intent.ACTION_DELETE, uri);
3. startActivity(it);
转自: http://blog.csdn.net/qr11121223/article/details/5935784
1. 首先大家需要知道,android对java core library中的众多class都作了修改,包括Thread, 所以android中的java.lang.Thread并非和java SE中的java.lang.Thread一模一样。还有其他众多的基础类也都有修改。
2. 关于时间的模型,参考android.os.SystemClock类的api,有三种模型:System.currentTimeMillis(),uptimeMillis()和elapsedRealtime()。我们这里要关心的是uptimeMillis()。
3. Looper类,Looper的作用是将一个普通线程转变为一个“不停地处理消息的线程”,一旦在某个线程的run()方法中启动了Looper.prepare()和Looper.loop(),那么这个线程就会有一个MessageQueue(在Looper构造函数中创建,关联在该Looper instance上)。其他线程或者该线程本身可以通过某个Handler往该MessageQueue中发送消息,而Looper在loop()循环中会不停地去取出消息,执行消息(如何执行见下面Handler中的描述)。参见Looper类api以了解更多内容。
4. MessageQueue:表面上该类是一个先进先出的队列,但其背后实现其实是一个linked list.该类有一个enqueueMessage()方法,用于将消息塞入队列中。每个Message对象上有一个when域,是个绝对时间(uptimeMillis度量模型),表明该消息何时应该真正“被递送".塞入队列的消息根据when的大小排序串起来,排在前面的when的时间小。当Looper每次从queue中取出消息对象的时候,会用当前时间和队列头上的消息的when比较,如果when<=当前时间了则被取出,否则消息继续悬挂在队列中等待"被递送"。Handler.postDelayed()或sendMessageDelayed()相关方法底下则是直接调用了MessageQueue的enqueueMessage(),将消息直接悬挂入队列中。
5. Message: 该对象表示塞入queue的消息。该对象上有一些重要的域:arg1,arg2,obj,setData()这些是消息所携带的数据;when表示该消息何时应该被递送(前面已有解说);target表示该消息该由哪个handler对象来处理,通过handler来发送消息的时候handler都会在发送方法中把这个域给置上(置成自己);callback表示该Message是否包装了一个Runnable对象,用handler.post()相关方法发送一个Runnable的时候其实底下还是发送了一个Message对象,该对象的callback设成了该Runnable instance; next域,用来将塞入MessageQueue的各个消息串起来,在MessageQueue中被使用。what代表该消息的code,即具体是什么类型的消息,每个what都在其handler的namespace中,因此不用担心一个handler中定义的what和另一个handler中定义的what有冲突,你只要保证一个handler instance处理的所有消息的what没有冲突即可。when,data,target,callback,next这些域都是package可见的,在相关的其他类中被使用,或者通过getter,setter方法被暴露。
6. Handler:一个handler instance被new出来的时候,会自动关联到该线程的Looper对象上,也就关联到了该Looper的MessageQueue上。发送任何消息都需要通过handler类。handler的众多方法都是线程安全的,因此假如我们在主线程中创建了一个handler instance,你可以把该handler传递给某个其他线程。其他线程利用该handler instance的post或send方法发送消息给该handler关联的message queue,也就是主线程的message queue, 主线程的Looper然后取出这些消息,拿出Message.target, 然后调用target上的dispatchMessage()方法,也就是Handler.dispatchMessage(). 该方法中如果发现该Message包装了一个Runnable,就直接调用该Runnable的run()方法;如果不是,如果该handler上挂了一个Handler.Callback对象,则调用他的handleMessage(), 否则则调用handler自己的handleMessage().注意这三类处理都是在主线程中所做。具体可参见Handler类源码。
7. 每个android的程序一启动便会有一个主线程(UI线程),该线程负责显示用户界面,管理各个component(activity, receiver等),处理用户界面上的各类消息等。该线程一启动内部便已经初始化了一个Looper,因此主线程已经有了一个MessageQueue。在Activity的onCreate方法中可以直接new Handler(),便会直接挂到该主线程的Looper上。
8. android.os.HandlerThread: 为了方便把一个普通线程变成一个有Looper和MessageQueue的线程,便对Thread类进行了包装,产生了此类。在onLooperPrepared()方法中你可以new出handler instance, 挂到该线程的Looper上。或者你先启动该HandlerThread,然后拿到他上面的Looper,把该Looper作为参数调用new Handler(Looper)构造函数,也可以实现handler和该thread上message queue的绑定。这个类只是为了方便实现Looper和message queue这种模式而以。
其他可参考的文章:
http://codinghard.wordpress.com/2009/05/16/android-thread-messaging/
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/
转至http://www.eoeandroid.com/thread-102699-1-1.html
http://www.eoeandroid.com/thread-102707-1-1.html
最近一直很忙,终于等到今天samsung面完了才有时间停下来写写面经,这些都是我的面试题,不过答案是我自己的,希望大家来指正,给各位正在挣扎的童鞋们加加油哈!!
1、面向对象的特征(2B的题目)
抽象、封装、继承、多态性【要了解具体的含义】
【
抽象是为了松耦合 封装是为了高内聚 模块化
继承是把双刃剑 一般建议是用组合
多态是抽象的结果 没有抽象就没有多态
在package内部使用继承是安全的,因为父类和子类是在同一个程序员的控制之下。当然,对于专门设计用来继承,并且有详细的扩展说明的类,使用继承也是安全的。但是,对于跨越package界限,对普通的,具体的class进行继承则是危险的。
继承,打破了封装性。子类太依赖于父类的实现细节。假如某个版本中的父类的实现细节发生了改变,子类会相应的受到破坏。
】
2、int与Integer的区别:
int是原始数据类型,Integer是int的封装类,Integer是引用类型;int基本数据运算速度快,而在map、list等只能装Object的容器中,就只能使用Integer等外覆类。
3、ArrayList、Vector、LinkedList的区别:
Collectiion接口派生了两个接口:List、Set。其中,ArrayList、Vector与LinkedList都是实现了List接口的类。ArrayList、Vector都是使用数组方式存储数据,因此查找数据操作快而插入数据慢,然而Vector使用了Synchronized方法进行线程安全处理,所以性能上比ArrayList差;另外,LinkedList使用双向链表存储数据,因此查找数据操作慢而插入数据快,同时,LinkedList是非线程安全的。
4、sleep()和wait()的区别:
sleep是线程类的方法,不会释放对象锁;而wait是Object类的方法,会释放对象锁。【腾讯一面】
5、启动线程应该调用start(),而不是run(),调用start()意味着它可以由虚拟机JVM调度执行,并不意味着线程会立即执行,实现并发操作。【腾讯一面】
6、抽象类和接口的区别:
抽象类可以有普通数据成员和非抽象方法。而 接口中不能有普通数据成员,只能够有静态而且不能被修改的数据成员,会隐式声明为static和final。而且接口中的方法一定是抽象方法。抽象类可以赋予非抽象方法的默认行为,即方法的具体实现。而接口中不能赋予方法的默认实现。Java中只能有单继承但是可以有多实现。【百度一面】
7、Android中的数据存储方式:
SharePreference方式;文件存储方式;SQLite方式;ContentProvider方式;网络存储方式。【腾讯一面】
8、Android四大组件:
Activity;Service;BroadcastReceiver;ContentProvider。
Service是一个具有较长生命周期但是没有用户界面的程序。一般由Activity启动,但是并不依赖于Activity,即当Activity生命周期结束时,Service仍会继续运行,直到自己生命周期结束为止。Service启动方式有两种:A、调用startService方式启动Service时,会依次调用onCreate和onStart方法来启动Service;调用stopService方法来结束Service时,又会调用onDestroy方法来结束Service;B、调用bindService方法启动Service时,会依次调用onCreate和onBind方法来启动Service,调用unbindService方法结束时,又会调用onUnbind和onDestroy方法。
BroadcastReceiver用来接收系统或者某个应用程序所发送的广播消息。有两种注册方式:在代码中注册、在配置文件中注册。
ContentProvider是用来实现应用程序之间数据共享的类,它为共享数据定义一个URI,然后应用程序通过Context获得ContentResolver并将数据的URI传入即可。【网易笔试】
9、Android中Activity的四种加载模式:
Standard:标准模式,一调用startActivity方法就会产生一个新的实例。
SingleTop:当有一个实例位于Activity栈的顶部时,就不产生新的实例。如果不位于栈顶,就产生一个新的实例。
SingleTask:会在一个新的task中产生这个实例,以后每次都是调用这个实例,而不产生新的的实例。即一个task中不会出现重复的Activity实例。
SingleInstance:跟SingleTask很类似,在这个模式下,每个task中只有一个Activity的实例,不能有其他的实例。【新讯电面】
10、进程与线程的区别:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度的基本单位。线程不能够独立执行,必须由应用程序提供多个线程的执行控制。进程拥有独立的可执行代码和数据的内存空间,而线程中的多个线程共享数据内存空间。【百度一面】
写的好累,等以后再继续,觉得答案有什么不对劲的童鞋请留言或Q:826340417.
技术面经二:
1、请用程序实现:扫描指定文件夹下的所有指定后缀文件:【人人笔试】
public ArrayList<String> searchFiles(String path, String suffix){ ArrayList<String> resultpaths = null; String result; File dir = new File(path); File[] files = dir.listFiles(); if (files == null) return null; for (File f : files) { // 为目录 if (f.isDirectory()) { ArrayList<String> tmp = searchFiles(f.getPath(), suffix); if (tmp != null) { if (resultpaths == null) resultpaths = new ArrayList<String>(); resultpaths.addAll(tmp); } // 为普通的文件 } else { if (f.getName().endsWith(suffix)) { result = f.getPath(); resultpaths.add(result); } } } return resultpaths; }
2、i++的线程安全性:
由于i++操作并不是原子的,所以同一进程的不同年该线程可能访问到该变量,所以它是非线程安全的。i++最终被编译后的反汇编代码如下:mov eax,[xx] ;inc eax。由于i++这条语句被分为两条操作指令,所以在执行这两条指令之间,可能由于中断而被调度到不同线程,于是产生了不安全性。【人人笔试】
3、CMWAP和CMNET的区别:
CMWAP是为手机wap上网而设立的,CMNET则主要是为PC、笔记本电脑等利用GPRS上网服务而设立的。CMWAP有部分限制,与CMNET资费上也存在差异。CMWAP介入指的是wap网的接入网关,只能浏览wap网址,CMNET则是接入internet浏览www网页的。【腾讯二面】
4、进程间通信的四种不同方式:
管道、信号、消息队列、共享内存。
使用消息队列传送控制类型的消息(数据量小且有明确的数据结构),使用共享内存传递数据类型的消息(数据量大);最好不要使用信号方式,因为当线程库不能做到异步安全时,使用信号作为通信方式会导致系统死锁。【百度】
5、你对华为文化的认识:
以客户为中心,以奋斗者为本,坚持长期艰苦奋斗,自我批判。【这是HR面时面试官告诉我的,要记住哈】
6、数据库的事务:访问并可能更新各种数据项的一个程序执行单元。数据库并发操作可能存在的异常情况:A、更新丢失;B、脏读取;C、不可重复读取。
SQL中的四个事务隔离级别:A、未授权读取:禁止两个事务同时写数据;B、授权读取:当一个事务在写数据时,禁止其他事务读写操作;C、可重复读取:只允许同时读取数据;D、串行:所有事务都是串行的而不是并发的。【网易笔试】
7、一个由C/C++编译的程序的内存分配:
栈区:由编译器子的那个分配释放,用于存放函数的参数值、局部变量的值等。
堆区:由程序员分配释放,若程序员没有释放,最终由操作系统回收。
全局区:全局变量和静态变量存储在一起。已经初始化的全局变量和静态变量存放在全局初始化区,未初始化的全局变量和静态变量存放在全局未初始化区。
常量区:存放常量字符串。
程序代码区:存放函数的二进制代码。【百度笔试】
8、TCP协议如何关闭连接的:
A、首先,Client(下面简称C)调用close(),给Server(下面简称S)发送FIN,请求关闭连接;S收到FIN之后给C发送ACK,同时关闭读通道,S状态变成CLOSE_WAIT状态;
B、接着,C收到对自己FIN确认的ACK之后,关闭写通道;
C、然后,S调用close()关闭连接,给C发送FIN,C收到后给S发送ACK,同时C关闭读通道,进入TIME_WAIT状态;
D、S收到C的ACK之后,关闭写通道,TCP连接转为CLOSED状态,也就是关闭连接;
E、C在TIME_WAIT状态下要等待最大数据段生存期的两倍,然后才进入CLOSED状态,TCP关闭连接的过程才彻底结束。【腾讯二面】
9、数据库系统提供两种不同类型的语言:
一种是数据定义语言,用于定义数据库模式;另一种是数据操纵语言,用于表达数据库的查询和更新。【网易笔试】
10、垃圾回收机制GC是Java语言的核心技术之一,GC有两种常用的算法来判断该对象是否可以回收:引用计数和对象引用遍历。
引用计数是GC的早期策略。在这种方法中,当创建一个对象时,就给这个对象分配一个变量,该对象计数设置为1。当其他对象被赋值为这个对象的引用时,计数加1.当一个对象的某个引用被回收或者被设置为新值时,对象的引用计数减1.任何引用计数为0的对象都可以当做垃圾回收。
对象引用遍历沿着整个对象图中的每天连接确定哪些为可达对象,并将他们进行标记。然后把标记的对象复制到堆栈的新域中,接着压缩整个堆栈,可以回收大量的内存碎片。
大牛们,觉得有问题记得告诉我啊,Q826340417