Android面试题搜集

来源:互联网 发布:阴阳师挂机软件ios 编辑:程序博客网 时间:2024/06/04 19:32

1.关于listview的优化
(1)重用convertView,减少view对象的创建,获取布局的缓存.
(2)使用ViewHolder,减少孩子对象的创建,减少findViewById的次数,对控件实例进行缓存.
(3)static class viewHolder,采用静态内部类,避免潜在的由于内部类导致的内存泄露.
(4)在列表里面有图片的情况下,监听滑动事件,只有item选中的时候才加载图片.
(5)根据MVC思想对adapter进行抽取,分为初始化视图(V)和得到数据(M)展示数据两部分(C).抽取一个superBaseAdapter进行复用.
2.listView展示数据几种形式
(1)从sqlite数据库拉取数据源显示
(2)从xml使用pull解析拉取数据源显示
(3从网络中拉取数据进行展示,这也是开发中最常用的.
3.IPC(Inter-Process Communication,进程间通信)
这里写图片描述
(1)最常用的是AIDL:
这里写图片描述
示例:这里写图片描述

//服务端的代码,做了权限package com.itanelse.alipay.service;import com.itanelse.alipay.aidl.AlipayRemoteService;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class AlipayService extends Service {    private static final String TAG = "AlipayService";    private static final int LESS_MONEY = 0;// 钱不够    private static final int BUY_SUCCESS = 1;// 购买成功    class AlipayAgent extends AlipayRemoteService.Stub {        @Override        public int forwardPayMoney(float money) throws RemoteException {            int result = pay(money);            return result;        }    }    @Override    public IBinder onBind(Intent intent) {        return new AlipayAgent();    }    @Override    public void onCreate() {        Log.d(TAG, "服务创建了");        super.onCreate();    }    public int pay(float money) {        Log.d(TAG, "服务中的方法被调用了");        if (money < 150f) {            return LESS_MONEY;        } else {            return BUY_SUCCESS;        }    }    @Override    public void onDestroy() {        Log.d(TAG, "服务销毁了");        super.onDestroy();    }}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.alipay.zhiubao"    android:versionCode="1"    android:versionName="1.0" >    <permission        android:name="oem.permission.SENDMAIL"        android:protectionLevel="normal" >    </permission>    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.alipay.zhiubao.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service            android:name="com.itanelse.alipay.service.AlipayService"            android:permission="oem.permission.SENDMAIL" >            <intent-filter>                <action android:name="com.alipay.MONEY" />            </intent-filter>        </service>    </application></manifest>
package com.itcatchfish.fish;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.itanelse.alipay.aidl.AlipayRemoteService;public class MainActivity extends Activity {    private EditText money;    private AlipayRemoteService agent; // 调用远程服务返回的binder代理类    private static final int LESS_MONEY = 0;// 钱不够    private static final int BUY_SUCCESS = 1;// 购买成功    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        money = (EditText) findViewById(R.id.main_money);    }    public void bindService(View v) {        Intent intent = new Intent();        intent.setAction("com.alipay.MONEY");        bindService(intent, new MyConn(), BIND_AUTO_CREATE);    }    private class MyConn implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            agent = AlipayRemoteService.Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    }    public void call(View v) {        float menoy = Float.valueOf(money.getText().toString());        try {            int result = agent.forwardPayMoney(menoy);            if (result == LESS_MONEY) {                Toast.makeText(this, "钱不够", 1).show();            } else if (BUY_SUCCESS == result) {                Toast.makeText(this, "购买成功", 1).show();            }        } catch (Exception e) {            e.printStackTrace();            Toast.makeText(this, "付款失败", 1).show();        }    }}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.itcatchfish.fish"    android:versionCode="1"    android:versionName="1.0" >    <uses-permission android:name="oem.permission.SENDMAIL" />    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.itcatchfish.fish.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

(2)步骤总结:
第一步,在服务端定义一个接口,在里面暴露出让客户端调用的方法,并把文件后缀改为aidl;如:IAlipayService
第二步,在服务端声明一个代理人类extends IAlipayService.Stub,并在这里调用服务端提供的远程方法;
第三步,在服务端通过onBind方法把该代理人类返回给调用者.
第四步,在客户端,把aidl接口包和里面的类拷贝到客户端工程目录,注意:必须一模一样;
第五步,在客户端,通过bindService的方法去绑定服务端的服务,这里需要一个ServiceConnection接口,我们写一个类实现该接口后,在它的onServiceConnected方法中获取到服务端中的代理人类,那么通过该代理人类就可以调用远程服务端的方法了.
第六步,我们的服务端的方法并不是可以任意调用的,这里可以添加一个权限,让调用者申请权限才可以调用.
4.

0 0
原创粉丝点击