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();
}
}
<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();
}
}
}
<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.