android面试总结

专业技能部分:

1.android的四大组件

 

      Activity,BroadcastReceive广播接收器,Service 服务,Content Provider内容提供者.

 

2.activity的生命周期
     onCreate,onStart,onResume,onPause,onStop(onRestart),onDestory
3.服务的生命周期
     onCreate(),onStartCommand(),onBind(), onUnbind(), onRebind() , onDestroy()
4.java的集合框架有哪些?IO流?多线程描述,以及什么是泛型?
     集合部分:
     集合分为单例集合和双列集合。Collection是单例集合的父类,Map是双列集合的父类。

    在单例集合Collection中比较重要的就是list集合和set集合。

    list集合是可重复的,有序的。其下有Arraylist(底层是数组结构)和LinekdList(底层是链表结构)用的比较多。还有一个效率比较低,安全的集合Vector被不安全的ArrayList取代了。

    set集合是不可重复的,无序的。其下HashSet(哈希表,HashCode() ,equest()) 和 TreeSet(二叉树)。

    Map中比较重要的HashTable(哈希表),HashMap(哈希表),TreeMap(二叉树)

    IO流:

        

        多线程:

        线程的两种创建方式:

                1>:继承Thread类

                2>:实现Runnable接口

                在实际开发过程中,一般开启一个线程都是指定实现某种特殊耗时操作的,由于该功能的单一性,一般情况下都会使用继承的方式来创                       建该线程.

                在android中,主线程由于直接和用户UI表现,因此android中不允许耗时的操作在主线程中执行的,所以要开启一个进行耗时操作的子线程来完成耗时操作,而子线程无法更改UI,因此在子线程耗时操作完成的时候就用到了Handlder通信机制来通知主界面来更改UI.

                因此,在android中子线程的开启多半会伴随着Handler一同使用.

         泛型:

        泛型通俗点就是用一个通用的类型(比如T)来代替所有的类型.

        由于在开发中增强代码的复用性,而某些方法如果指定具体的类型之后,再使用其他的类型就无法再调用该方法.而有了泛型之后就可以通过一个抽象的T来取代想要传入的参数类型,也就增强了代码的复用性.

        比如有时候我们要用到adapter的时候,而该adapter需要适配多个list数据,而该list数据又是多种,那么此时如果书写多个adapter来针对专用的list就使得代码比较臃肿,因此用泛型来代替就可以很好的对程序进行简化,提高复用性.

    5.集合和数组的区别

        集合可以说是一个可变长度的数组,并且集合封装的数据类型是一个具体的对象类型.

        在实际开发中,基本上都是使用集合来代替数组.

    6.android中常用的布局?

        FrameLayout,LinearLayout,AbsoluteLayout,RelativeLayout,TableLayout五种布局

    但是最常用的是LinerLayout和RelativeLayout,FrameLayout有时候也用,其他两种基本不使用.

   7.android中的数据存储方式有哪些?
    1>.Shared Preferences共享偏好
       该存储方式存储一些基本数据类型数据,以key和value的形式来存储数据,一般开发中在app启动的时候会从服务器获取该用户的基本数据信息使用SharedPreferences存储起来,待后续访问网络获取数据的时候将用户参数提取出来进行服务器信息的访问.
    2>本地file文件存储
        相对较大量的数据比如协议等数据就可以以IO流的方式存入到本地file文件.
         3> ContentProvider
        Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作
     4>SQLite: 
      SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。其中有两个方法在继承了SQLiteOpenHelper的时候必须实现:onCreate()和onUpgrade();
 
publicclassMyDatabaseHelperextendsSQLiteOpenHelper{
publicstaticfinalString CREATE_BOOK ="create table book ("
+"id integer primary key autoincrement, "
+"author text, "
+"price real, "
+"pages integer, "
+"name text)";
privateContext mContext;
publicMyDatabaseHelper(Context context,String name,
CursorFactory factory,int version){
super(context, name, factory, version);
mContext = context;
}
@Override
publicvoid onCreate(SQLiteDatabase db){
// TODO Auto-generated method stub
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show();
}
@Override
publicvoid onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
// TODO Auto-generated method stub
}
}
         关于数据库的更详细信息参考----->   06 数据存储全方案,详解持久化技术
     实际开发中sharedPreferences和SQLite用的比较多
 
      8.AsyncTask是什么,如何使用?与handlder有何区别?
    在android中处理异步操作的方式基本就是用到以上两种.
    其中handler需要我们自己去实现具体操作,通过创建线程进行耗时操作,完成之后就是通过handler来通知主线程来更改UI,这些操作都是开发者自己实现的.而AsyncTask是android封装好了的异步工具,其内部已经实现了创建线程等耗时,只需要在特定方法里实现耗时操作就可以了,其内部已经创建好了线程进行该任务操作.
    如下:
 
privateclassMyTaskextendsAsyncTask<String,Integer,String>{
//onPreExecute方法用于在执行后台任务前做一些UI操作
@Override
protectedvoid onPreExecute(){
Log.i(TAG,"onPreExecute() called");
textView.setText("loading...");
}
//doInBackground方法内部执行后台任务,不可在此方法内修改UI
@Override
protectedString doInBackground(String... params){
Log.i(TAG,"doInBackground(Params... params) called");
try{
HttpClient client =newDefaultHttpClient();
HttpGet get =newHttpGet(params[0]);
HttpResponse response = client.execute(get);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
long total = entity.getContentLength();
ByteArrayOutputStream baos =newByteArrayOutputStream();
byte[] buf =newbyte[1024];
int count =0;
int length =-1;
while((length = is.read(buf))!=-1){
baos.write(buf,0, length);
count += length;
//调用publishProgress公布进度,最后onProgressUpdate方法将被执行
publishProgress((int)((count /(float) total)*100));
//为了演示进度,休眠500毫秒
Thread.sleep(500);
}
returnnewString(baos.toByteArray(),"gb2312");
}
}catch(Exception e){
Log.e(TAG, e.getMessage());
}
returnnull;
}
//onProgressUpdate方法用于更新进度信息
@Override
protectedvoid onProgressUpdate(Integer... progresses){
Log.i(TAG,"onProgressUpdate(Progress... progresses) called");
progressBar.setProgress(progresses[0]);
textView.setText("loading..."+ progresses[0]+"%");
}
//onPostExecute方法用于在执行完后台任务后更新UI,显示结果
@Override
protectedvoid onPostExecute(String result){
Log.i(TAG,"onPostExecute(Result result) called");
textView.setText(result);
execute.setEnabled(true);
cancel.setEnabled(false);
}
//onCancelled方法用于在取消执行中的任务时更改UI
@Override
protectedvoid onCancelled(){
Log.i(TAG,"onCancelled() called");
textView.setText("cancelled");
progressBar.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
      9.说说xml解析和Json解析?
       在网络上传输数据时最常用的格式有两种, XML  和  JSON
        1>.针对xml的文件,一般情况可以通过pull计息和sax解析两种方式
            pull解析:
 
privatevoid parseXMLWithPull(String xmlData){
// TODO Auto-generated method stub
try{
XmlPullParserFactory factory =XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(newStringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String id ="";
String name ="";
String version ="";
while(eventType !=XmlPullParser.END_DOCUMENT){
String nodeName = xmlPullParser.getName();
switch(eventType){
// 开始解析某个节点
caseXmlPullParser.START_TAG:{
if("id".equals(nodeName)){
id = xmlPullParser.nextText();
}elseif("name".equals(nodeName)){
name = xmlPullParser.nextText();
}elseif("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
break;
}
caseXmlPullParser.END_TAG:{
if("app".equals(nodeName)){
Log.d("MainActivity","id is"+ id);
Log.d("MainActivity","name is "+ name);
Log.d("MainActivity","version is "+ version);
}
break;
}
default:
break;
}
eventType = xmlPullParser.next();
}
}catch(Exception e){
e.printStackTrace();
}
}
            SAX解析:
        新建一个类继承自  DefaultHandler,并重写父类的五个方法:
 
publicclassMyHandlerextendsDefaultHandler{
privateString nodeName;
privateStringBuilder id;
privateStringBuilder name;
privateStringBuilder version;
@Override
publicvoid startDocument()throwsSAXException{
//初始化容器,用来存放解析出来的数据。
id =newStringBuilder();
name =newStringBuilder();
version =newStringBuilder();
}
@Override
publicvoid endDocument()throwsSAXException{
// TODO Auto-generated method stub
super.endDocument();
}
@Override
publicvoid startElement(String uri,String localName,String qName,
Attributes attributes)throwsSAXException{
//记录当前节点名
nodeName = localName;
}
@Override
publicvoid endElement(String uri,String localName,String qName)
throwsSAXException{
if("app".equals(localName))
{
Log.d("MyHandler","id is "+ id.toString().trim());
Log.d("MyHandler","name is "+ name.toString().trim());
Log.d("MyHandler","version is "+ version.toString().trim());
//最后要将StringBuilder清空掉。
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
publicvoid characters(char[] ch,int start,int length)
throwsSAXException{
//根据当前的节点名判断将内容添加到哪一个StringBuilder对象中
if("id".equals(nodeName))
{
id.append(ch,start,length);
}elseif("name".equals(nodeName))
{
name.append(ch,start,length);
}elseif("version".equals(nodeName))
{
version.append(ch,start,length);
}
}
}
            MainActivity中sax解析逻辑:
 
privatevoid parseXMLWithSAX(String xmlData){
// TODO Auto-generated method stub
try{
SAXParserFactory factory =SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
MyHandler handler =newMyHandler();
//将MyHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
xmlReader.parse(newInputSource(newStringReader(xmlData)));
}catch(Exception e)
{
e.printStackTrace();
}
}
 
        2>.针对Json的文件,使用json解析或则gson解析.
            比起 XML, JSON 的主要优势在于它的 体积更小,在网络上传输的时候可以更 省流量。但缺点在于,它的 语义性较差,看起来 不如 XML  直观
      解析 JSON 数据也有很多种方法,可以使用官方提供的  JSONObject,也可以使用谷歌的开源库  GSON。另外,一些第三方的开源库如  Jackson FastJSON 等也非常不错。
      a.JSONObject解析
 
/**
* 使用JSONObject
* @param xmlData
*/
privatevoid parseJSONWithJSONObject(String jsonData)
{
try{
JSONArray jsonArray =newJSONArray(jsonData);
for(int i =0; i < jsonArray.length(); i ++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d("MainActivity","id is "+ id);
Log.d("MainActivity","name is "+ name);
Log.d("MainActivity","version is "+ version);
}
}catch(Exception e)
{
e.printStackTrace();
}
}
            b.谷歌开源GSON解析
        必须要在项目中添加一个 GSON的  Jar 。 
         GSON主要就是可以将一段 JSON格式的字符串自动 映射成一个对象
 
privatevoid parseJSONWithGSON(String jsonData)
{
Gson gson =newGson();
List<App> appList = gson.fromJson(jsonData,newTypeToken<List<App>>(){}.getType());
for(App app : appList)
{
Log.d("MainActivity","id is "+ app.getId());
Log.d("MainActivity","name is "+ app.getName());
Log.d("MainActivity","version is "+ app.getVersion());
}
}
    在我们的项目中,使用GSON解析比较多些.
    10:自定义控件原理?
          android中针对视图是一个组合模式:即view和ViewGroup的组合.
            view ---> viewGroup --->view
                    |__  view           |_   viewGroup-->....
 
     view定义绘图的基本操作, 基本操作由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。
      1>、measure操作
     measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:
     (1)onMeasure(),视图大小的将在这里最终确定,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。
 
2>、layout操作
     layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作:
     (1)setFrame(l,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于将这些参数保存起来;
     (2)onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的;
 
3>、draw操作
     draw操作利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。子类也不应该修改该方法,因为其内部定义了绘图的基本操作:
     (1)绘制背景;
     (2)如果要视图显示渐变框,这里会做一些准备工作;
     (3)绘制视图本身,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对于ViewGroup则不需要实现该函数,因为作为容器是“没有内容“的,其包含了多个子view,而子View已经实现了自己的绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw()方法;
     (4)绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;
     (5)如果需要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),开始绘制渐变框;
     (6)绘制滚动条;
      从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。
 
    11:使用过哪些开源框架?
        android-flip  翻页的效果
     SmartImageView  图片加载查看   针对图片下载中以及图片下载完成之后显示的图片,将网络图片以及这两种图片封装起来.
     SlideMenu    滑动式菜单
     ViewPagerIndicator  选项卡
      android-pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新
      Cropper  自定义截图
    
    12.listView的缓存机制和优化,以及listView滚动过程中图片显示混乱,错乱,闪烁的原因是什么?如何解决?
          listView在android开发中是非常常用的组件.
        针对大量相同格式的数据的展现就可以使用listView来展示.
        1.复用convertView.由于针对的很多都是相同格式的数据,因此在listView中有一个convertView的复用.这个复用是复用的模版,不至于每次加载每次item的时候都创建新的模版,从而减少内存的负担.
        2.viewHolder的使用,在判断convertView不是null的时候再创建viewHolder对象,减少view被创建的次数,从而降低消耗.
        3.分页加载数据.由于item数量一般较多,因此需要分批加载item数据,提高程序的流畅性以及用户体验.
        针对图片混乱,错乱的问题,解决方法是给图片设置tag标志,当复用的时候,判断该标记是不是和当前的图片url相同,如果相同就设置图片,否则不设置.
        而且在加载图片的时候,由于服务器加载图片需消耗一段时间,因此给图片设置一张默认的图片就是很有必要的.其实这里可以使用第三方比如SmartImageView.
    13.java中常用的设计模式有哪些?
        1>单例设计模式        有时候创建了一个对象之后,我们会希望该对象在内存中只需要存在一份,那么就需要控制只创建一个对象.单例设计模式有两种创建方式,一种是饿汉式(先创建对象),一种是懒汉式(后创建对象)
 
publicclassSingleton{
privateSingleton(){}
privatestaticSingleton singleton =null//不建立对象
publicstaticsynchronizedSingleton getInstance(){
if(singleton ==null){//先判断是否为空
singleton =newSingleton();//懒汉式做法
}
return singleton
}
 
publicclassSingleton{
publicSingleton(){}
privatestaticSingleton singleton =newSingleton();//建立对象
publicstaticSingleton getInstance(){
return singleton //直接返回单例对象 }}
        针对某个对象如果使用很频繁那么使用饿汉式会好点,如果使用不是很频繁,那么使用懒汉式比较好.
        2>MVC 设计模式       M:Moder 模型,数据逻辑    V:View  界面   C:Controler   控制器
            在android开发中,给用户最直观的就是view,而这些Viwe都是需要通过数据来展示的,就里就需要有数据逻辑.而View和数据逻辑之间如何展示,就需要通过ontroler控制器来完成
            比如在开发中,listView本身是一个组件,那么该组件需要通过list数据来展示item,从服务器获取的数据list集合就相当于moder,再通过Adapter将view和数据list集合起来.
        3>代理模式        a想访问b,不直接访问,而通过中间代理c来达到访问b的目的.
            比如开发中使用的多个fragment之间的数据通信,就可以通过activity来达到传递的目的.
            一个activity去绑定一个服务service,那么就是通过系统android中的binder机制的中转,而binder机制就是起到了代理作用.
        4>工厂模式        由于android是由java语言开发,而jiava语言是对象语言,都是围绕对象来展开的,那么创建对象就是工厂模式通过new来创建出来,类其实就相当于工厂,对象就是通过工厂生产出来的一个实例.
            Person person = new Person(); 其中Person是一个类(工厂),person就是一个实例对象.
 
    14.说说android中的进程回收机制?
        优先级从高到低:
          1.前台进程(Foreground process)        
          2.可视进程 (Vsible process)           可以看见,但是不可以交互。
          3.服务进程(Service process)  
          4.后台进程(Background process)      
          5.空进程(Empty process)                当程序退出时,进程没有被销毁,而是变成了空进程。
           系统本身会根据优先级对以上进行回收.如果系统内存不足就会优先回收空进程,然后是后台进程,而前台进程,可视进程以及服务进程是不容易被系统回收的,但是在极端情况下也会依优先级回收其他进程,但是当系统内存充足的时候又会重新开启前台,可视以及服务进程.
    15.sharesdk使用过吗?
        针对有时候app需要将某些信息分享出去如微信,微博,qq等,就要用到第三方分享sharesdk.
        
    16.android中的传感器以及多媒体是怎么样的?
        手机中内置的传感器是一种微型的 物理设备,它能够 探测、感受到外界的信号,并按一定规律转换成我们所需要的信息。Android 手机通常都会支持多种类型的传感器,如 光照传感右器、 加速度传感器、 地磁传感器、 压力传感器、 温度传感器等。
     管理传感器,就对应了 SensorManager 这个对象.通过这个对象再senserManager.getDefaultSensor(Sensor.TYPE_LIGHT);来获取对应的传感器对象.
    17.android中的动画有哪几种?
          帧动画:
          将一张完整的动画图片拆分成一张张单独的图片,然后再将他们连贯起来进行播放。
      补间动画:
          通过父容器将其隐藏再不断的重绘来达到动画效果,其实view并没有改变。位移、旋转、缩放、渐变、 只能作用在View上面。
      属性动画:
          属性动画是3.0出现的,它不仅可以对view添加动画效果,还可以对对象添加动画效果和对动画进行拓展。
       ValueAnimation:    对值进行一个平滑的动画过度。
       ObjectAnimation:   它可以直接对任意对象进行动画操作。
     他们都具备ofFloat()方法,因为ObjectAnimation是ValueAnimation的子类,只是方法的参数列表不一样。
     ObjectAnimation中的ofFloat()的第二个参数并不是根据传入的字符串进行解析,其内部是去寻找和其相关的get和set方法。
    18.android中的消息推送机制.
        有时候我们需要针对系统通知及时发送到客户端,比如一些新闻的app或者活动开启消息通知等.但是由于消息不是固定的,时间也是不确定的,那么就需要通过与服务器保持一个长连接来达到这个目的.但是考虑到如果每个客户端都与服务器长时间连接状态,会给服务器产生很大的压力,因此通过第三方(相当于一个服务器)来将数据接受,再发送到客户端.因此,消息推送机制,其实起到一个中转信息的服务器.
        比较常用的消息推送工具是极光推送,百度推送也用过,但是没有极光推送简便.
    19.什么是OOM异常,如何避免该异常的出现?
        OOM异常是因为内存溢出而抛出的异常(out of mamery).
        在android开发中,最容易占去大量内存的一般都是图片以及开启的线程过多而没有及时释放.因此,处理OOM异常的关键点就是处理图片以及优化线程.除此之外还有对于对象引用强度的控制,也就是对于应用中多使用单例的设计模式,或者对于使用完毕的对象及时=null,因为这样对象就会便于系统回收.
        图片: 对于图片通过BitmapFactory.decodeStream()来获取到一个bitmap对象.然后再将其设置为iamgeView的source资源.当然,这是一个习惯的写法,具体还是要通过对图片进行压缩来展示,这样会大大降低加载图片所需要的内存.并且对于图片操作完成之后要记得对bitmap进行回收.bmp.recycle();
        线程:当需要进行耗时操作的时候,我们就需要通过开启一些子线程进行耗时操作,而当程序变得不可见的时候有时候线程没有能及时回收.在activity中一般情况根据需求在onPouth中对线程进行回收,而在onResume中对线程重新开启,但是需要保证当前的线程不是重复开启的.
    20.说说touch的传递机制
        在android中,对于view或者viewGroup,当被点击之后,那么究竟要哪个组件来响应这个点击事件呢?
        android通过touch的传递机制来控制的.
        首先最外层的DispatchToachEvent()方法会接受到事件,默认情况下返回fasle对事件进行分发.当分发完成后,会进入onInterceptTouchEvent()方法,在这里会对于事件是不是需要拦截,此时如果返回false,表示不拦截,那么事件会传递到下一层组件的DiapatchToachEvent()方法,在该方法还会执行以上的逻辑,如果事件在onInterceptTouchEvent中事件被拦截就会调用该组件中的第三个方法onTouchEvent().一般情况下我们都是在onTouchEvent()方法中对事件做出回应.
 
    主要应用就是有时候需要在点击事件的时候希望某些组件拦截或者不拦截该事件.
        
    21.什么是MVC思想?
        M:model   V:view  C:controler
        MVC是android中的一种设计模式,其实就是数据,view,以及控制器之间的相互关联.
        最直观的是view的展示,而view又是依赖数据的,那么如何将数据放入view中,就是通过adapter等这些适配器来完成的.
        比如listView是一个view,但是listView展示需要数据,也就是list的数据,而想要将数据写入到view中,就需要用到baseAdapter来完成.
    22.说说intent是如何传递数据的?
        intent在安卓中是非常常用的.当我们开启一个activity或者sevase,给下一个activity传递基本数据类型以及对象都是可以的.
        通过startActivity()来开启一个activity,通过startSevase()来开启一个服务.    
        通过intent.putExtry()传递基本的数据类型,接受的时候在下一个activity中getIntent获取到intent对象,再getStringExtry()等方法获取传递的基本类型数据.
        而且intent还可以传递一个序列化的对象(实现了 Serializable接口),中间就是通过一个Bundler对象来完成的.
 
Bundle mBundle =newBundle();  
mBundle . putSerializable ( SER_KEY , mPerson );
mIntent.putExtras(mBundle);
        除此之外,Intent还可以开启一些系统服务,比如浏览器,拨打电话,发送邮件等.
参考:
 
// 调用浏览器
Uri webViewUri =Uri.parse("http://blog.csdn.net/zuolongsnail");
Intent intent =newIntent(Intent.ACTION_VIEW, webViewUri);
// 调用地图
Uri mapUri =Uri.parse("geo:100,100");
Intent intent =newIntent(Intent.ACTION_VIEW, mapUri);
// 播放mp3
Uri playUri =Uri.parse("file:///sdcard/test.mp3");
Intent intent =newIntent(Intent.ACTION_VIEW, playUri);
intent.setDataAndType(playUri,"audio/mp3");
// 调用拨打电话
Uri dialUri =Uri.parse("tel:10086");
Intent intent =newIntent(Intent.ACTION_DIAL, dialUri);
// 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />
Uri callUri =Uri.parse("tel:10086");
Intent intent =newIntent(Intent.ACTION_CALL, callUri);
// 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)
Uri emailUri =Uri.parse("mailto:zuolongsnail@163.com");
Intent intent =newIntent(Intent.ACTION_SENDTO, emailUri);
// 直接发邮件
Intent intent =newIntent(Intent.ACTION_SEND);
String[] tos ={"zuolongsnail@gmail.com"};
String[] ccs ={"zuolongsnail@163.com"};
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT,"the email text");
intent.putExtra(Intent.EXTRA_SUBJECT,"subject");
intent.setType("text/plain");
Intent.createChooser(intent,"Choose Email Client");
// 发短信
Intent intent =newIntent(Intent.ACTION_VIEW);
intent.putExtra("sms_body","the sms text");
intent.setType("vnd.android-dir/mms-sms");
此外:Intent有分为显示Intent和隐式Intent
以上为显示Intent,而对于隐式的Intent,需要在MainaFest文件中设置隐式条件.在调用的时候,如果在设置中与配置吻合就会触发intent事件.
 
<activity
android:name=".OtherActivity"
android:label="OtherActivity">
<intent-filter>
<action android:name="com.xiazdong.action"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.xiazdong.category"/>
<data
android:host="www.xiazdong.com"
android:scheme="xiazdong"/>
</intent-filter>
</activity>
 
Intent intent =newIntent();
intent.setAction("com.xiazdong.action");
intent.addCategory("com.xiazdong.category");
intent.setData(Uri.parse("xiazdong://www.xiazdong.com/xia"));
startActivity(intent);//此方法中调用intent.addCategory("android.intent.category.DEFAULT");
 
    23.context是什么?
    context在android中俗称上下文.代表着某一个对象为参照物.
     有时候我们需要一个context对象的时候,如果在非匿名类中会以this取代,因为this就是代表了当前的activity.而在匿名类中这样就不可以了,因为this无法指定,因此需要通过类名.this来确定该context是哪个context.其实我们在使用的时候,为什么要用到context,因为我们当前程序在运行的过程中,需要一个指定,而这个指定就需要是某个东西才能确定它其中会不会有某些方法或者功能.而有时候这个context指定错误的话,我们就不能去开启某些功能或者服务.
    打个比方,如果在a家中,说孩子,就肯定会明确是a的孩子,那么这里的context就相当于a,this就是a,但是在商城中,如果说孩子,那就不明确是谁的孩子,所以要指定一个家庭.this来指定是谁(相当于类名.this);
其他:    

    1.android开发中经常容易出现什么样的问题?有哪些技术难点?

    2.屏幕适配方面是怎么做的?

    3.版本适配是怎么做的?

 

        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值