Android面试题搜集

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值