当前位置:  编程技术>移动开发
本页文章导读:
    ▪CM7大局透明及联系人拨号键背景黑块的解决        CM7全局透明及联系人拨号键背景黑块的解决 全局背景制作  首先下载APKTOOL反编译工作,做好windows下的JAVA环境设置相关教程在帖子里都有哒~~我就不再详述了!提取CM6/CM7原包的framework-res.apk.........
    ▪ 打开跟关闭输入法        打开和关闭输入法 在应用程序中,我们经常需要控制EditText的输入法打开与关闭,手指touch之后,自动打开了输入法,可是怎么控制关闭输入法,除了输入法自己的关闭按钮之外,还有以.........
    ▪ Binder机制分析【2】-Binder服务/客户端实现举例       Binder机制分析【二】-Binder服务/客户端实现举例 前一章说了下Binder机制的实现分析,这章就主要通过实际的例子来看看,具体的服务端创建。一般而言,同一个进程里的沟通称之为短程沟.........

[1]CM7大局透明及联系人拨号键背景黑块的解决
    来源: 互联网  发布时间: 2014-02-18
CM7全局透明及联系人拨号键背景黑块的解决

全局背景制作 

首先下载APKTOOL反编译工作,做好windows下的JAVA环境设置相关教程在帖子里都有哒~~我就不再详述了!提取CM6/CM7原包的framework-res.apk文件,(记住一定是原包哦,不然回编译会出错的。相关的图片替换美化,请在全局背景修改过后再做好啦~ )在运行里输入CMD,在DOS模式下运行下列命令
apktool if framework-res.apk               * 建立framework-res.apk的运行环境
apktool d framework-res.apk               *反编译framework-res.apk修改全局背景需要修改framework-res.apk中间的XML参数,具体路径在反编译目录下framework-res/res/values/styles.xml
第一步:
用notepad++.exe或其他编辑软件打开Style.xml定位文件~搜索
<itemname="windowBackground">@drawable/screen_background_dark</item>这一行的意思是定义windowBackground为一种颜色,我们可以让这段窗口参数指向自己所设置的背景图片:修改为:<itemname="windowBackground">@drawable/window_background_texture</item>
其中这一行的定义就是将一幅以window_background_texture.png为文件名的图片指向于"windowBackground"背景参数,与此同时我们要将自己准备好的480*854分辨率的图片改名成window_background_texture.png放到res/drawable-hdpi/图片目录中第二步:
依旧用notepad++.exe或其他编辑软件打开Style.xml找到
<item name="cacheColorHint">?colorBackgroundCacheHint</item>
这一行的意思是CM为了运行缓存加载色彩而做的修改,后面的代码是颜色参数,我们将这个参数设置为透明就可以显示我们上面添加的图片了
修改为
<item name="cacheColorHint">@color/transparent</item>
然后用apktool b framework-res.apk  回编译framework-res.apk文件
(这里的APK不要直接用到包包里,否则在集成在ROM里或者3WIPE之后会卡M)
  现在必须用RAR软件打开回编译好的framework-res.apk文件夹提取根目录下的resources.arsc文件,同样打开原来的反编译前的framework-res.apk替换同目录下的resources.arsc文件就好了,同时也要把window_background_texture.png图片文件拉到反编译前的原framework-res.apk的framework-res/res/drawable-hdpi目录下。就完成了
修改状态栏下拉通知颜色及大小     
反编译framework-res。进入framework-res\res\values\打开styles.xml修改707-712列. 修改后保存回编译。


加入拨号背景和通讯录拨号按钮黑块处理
拨号背景加入:反编译Contacts.apk 进入Contacts\res\values\打开styles.xml把第四行和第五行替换为:<itemname="android:windowBackground">@drawable/custom_background_dialer</item><itemname="android:windowNoTitle">@null</item> 定义并实现custom_background_dialer.php图片为背景。通讯录拨号按钮背景黑块处理:进入Contacts\res\drawable\打开list_item_background_secondary.xml、call_background_secondary.xml、call_background.xml修改每个xml文件的<item定义最后一行为android:drawable="@android:color/transparent"其目的定义通讯录拨号按钮背景为transparent透明。 

温馨提示:如有朋友遇到回编译失败,在反编译的时候注意看反编译成功提示有无带*.9.php文件错误。如果有请先找到大小和原版一样的图片,通过压缩软件塞进去。在反编译,直到无*.9.php文件错误提示。这样可以避免除语言定义错误外的无法回编译情况。


    
[2] 打开跟关闭输入法
    来源: 互联网  发布时间: 2014-02-18
打开和关闭输入法
在应用程序中,我们经常需要控制EditText的输入法打开与关闭,手指touch之后,自动打开了输入法,可是怎么控制关闭输入法,除了输入法自己的关闭按钮之外,还有以下的方法。

      一、打开输入法窗口:

InputMethodManager inputMethodManager = (InputMethodManager)           getSystemService(Context.INPUT_METHOD_SERVICE);

// 接受软键盘输入的编辑文本或其它视图

imm.showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);


二、关闭出入法窗口


InputMethodManager inputMethodManager = (InputMethodManager)               getSystemService(Context.INPUT_METHOD_SERVICE);


inputMethodManager.hideSoftInputFromWindow(OpeListActivity.this.getCurrentFocus().getWindowToken(),


InputMethodManager.HIDE_NOT_ALWAYS);


//接受软键盘输入的编辑文本或其它视图
inputMethodManager


.showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);
三、如果输入法打开则关闭,如果没打开则打开

InputMethodManager m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

四、获取输入法打开的状态

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();
isOpen若返回true,则表示输入法打开

    
[3] Binder机制分析【2】-Binder服务/客户端实现举例
    来源: 互联网  发布时间: 2014-02-18
Binder机制分析【二】-Binder服务/客户端实现举例
前一章说了下Binder机制的实现分析,这章就主要通过实际的例子来看看,具体的服务端创建。一般而言,同一个进程里的沟通称之为短程沟通,进程间的沟通称之为远程沟通,短程沟通的效率远高于远程沟通,但是Android提供的Binder机制就提供了高效率的远程沟通。
下面通过Activity与Service之间的沟通为例,列举出2种实现方式。
例子一:通过直接继承Binder实现
1. 实现Binder类
public class MyBinder extends Binder {
	private Context mContext;
	public MyBinder(Context context){
		mContext = context;
	}
	@Override
	protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
			throws RemoteException {
		reply.writeString(data.readString()+" mp3");
		switch(code){
			case 1:
				MyMediaPlayer.getIntance(mContext).play();
				break;
			case 2:
				MyMediaPlayer.getIntance(mContext).stop();
				break;
			default:
				break;
		}
		return true;
	}
}

该类继承了Binder类,就必须实现onTransact方法,与客户端的transact方法相对应。其中参数code代表客户端调用码,决定在服务器端调用哪个方法,和transact端的保持一致,data是请求参数,由客户端设置,reply为返回参数,服务器端设置。Flags表示ipc通信方式。0表示双向,1表示单向。
2. 实现service类
public class MyService extends Service {
	private Binder mBinder = null;
	@Override
	public IBinder onBind(Intent arg0) {
		Log.e("XXX", "onBind");
		return mBinder;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		mBinder = new MyBinder(this);
		Log.e("XXX", "onCreate");
	}
}

Service相对简单,主要是初始化Binder对象,并且在onBind中返回。
3. Activity与service之间的沟通
首先需要创建ServiceConnection对象,并且在bind时返回Binder对象
private ServiceConnection mServiceConnection = new ServiceConnection() {
		@Override
		public void onServiceDisconnected(ComponentName name) {
			Log.e("XXX", "onServiceDisconnected");
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mIBinder = service;
			Log.e("XXX", "onServiceConnected");
		}
	};

其次,调用bindService绑定服务。
Intent intent = new Intent("com.eric.ipc.binder");
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

最后,在需要调用服务器端方法的地方,通过transact进行沟通,这里传递的参数必须是Parcel的。
Parcel send_data = Parcel.obtain();
				send_data.writeString("play");
				Parcel reply_data = Parcel.obtain();
					mIBinder.transact(1, send_data, reply_data, 0);

由此可见,这种方法提供的沟通手段比较单一,只能通过transact进行沟通,如果服务器端的接口很多,这样调用起来不太方便,所以Android提供了一种更为简单的方式来实现-AIDL。
AIDL定义了Proxy/Stub封装了IBinder接口,提供了更加方便的新接口。
例子二:通过AIDL实现
1. 单一aidl文件接口
package com.eric.ipc.aidl;
interface IMediaPlayer {
	void play();
	void stop();
}

该接口文件以aidl结尾,中间封装了2个方法,该文件生成后,会在gen目录下自动生成对应的java文件,里面包含了具体的类别继承,反向呼叫等实现。
2. 实现Binder类
public class MyBinder extends IMediaPlayer.Stub {
	private Context mContext;
	public MyBinder(Context context){
		mContext = context;
	}
	@Override
	public void play() throws RemoteException {
		MyMediaPlayer.getIntance(mContext).play();
	}
	@Override
	public void stop() throws RemoteException {
		MyMediaPlayer.getIntance(mContext).stop();
	}
}

现在的实现继承接口改为了aidl类文件的Stub,此处需要实现接口中的2个接口方法
3. 实现service类
此处同例一保持一致
4. activity与service之间的沟通
首先,需要实现ServiceConnection对象,注意返回binder对象时与例一之间的差别。
private ServiceConnection mServiceConnection = new ServiceConnection() {
	   @Override
	   public void onServiceDisconnected(ComponentName name) {
		   Log.e("XXX", "onServiceDisconnected");
	   }
	   
	   @Override
	   public void onServiceConnected(ComponentName name, IBinder service) {
		   mIBinder = IMediaPlayer.Stub.asInterface(service);
		   Log.e("XXX", "onServiceConnected");
	   }
   };

其次,需要绑定服务,方法同例一
最后,具体调用服务器端接口
mIBinder.play();

总结:
2种方法都可以实现跨进程通信,但是aidl实现相对简单,接口直接调用。
问题:
1.如果我们想保持和 Service 的通信,又不想让 Service 随着 Activity 退出而退出呢?你可以先 startService() 然后再 bindService() 。当你不需要绑定的时候就执行 unbindService() 方法,执行这个方法只会触发 Service 的 onUnbind() 而不会把这个 Service 销毁。这样就可以既保持和 Service 的通信,也不会随着 Activity 销毁而销毁了。
2.Activity has leaked ServiceConnection异常
这个异常是由于在启动应用时绑定了service,退出时没有接触绑定导致,可以在退出时调用unbindService()方法解决。
3.在先startService(),然后bindService()的情况下,在退出时
1).如果只调用unbindService(),在第一次会调用onUnbind,然后再次绑定时,通过start启动,再退出是不会调用onUnbind。
2).如果调用unbindService()和stopService,整个service会调用ondestory进行销毁。
3.在通过MediaPlayer播放音乐时,网上都说如果在activity中播放,在activity退出时,音乐播放会停止,这个纯粹是他妈的扯淡,我以前还对此坚信不疑。MediaPlayer播放音乐,会重新启动一个service进行播放,如果你的activity或service已经destory了,是不影响播放service的生命周期的。


例子源码见附件

本章介绍了Binder服务器的实现及举例说明了binder客户端与服务端的交互,下一章介绍下Service是如何绑定Binder的
1 楼 nanapoleon 2012-03-13  
Flags表示ipc通信方式。0表示双向,1表示单向。   这个和aidl的oneway是不是一样的。
2 楼 zhy20045923 2012-03-13  
nanapoleon 写道
Flags表示ipc通信方式。0表示双向,1表示单向。   这个和aidl的oneway是不是一样的。

这个是不一样的,aidl其实默认的也是0.
oneway的意思是在ipc过程中,如果调用者和被调用者在2个不同的进程,调用者不必等到被调用者返回就继续执行。

以下是引用:The oneway keyword means that if that call results in an IPC (i.e. the caller and callee are in different processes) then the calling process will not wait for the called process to handle the IPC. If it does not result in an IPC (i.e. they're both in the same process), the call will be synchronous. It's an unfortunate detail that simplifies the implementation of binder IPC a lot. If they're in the same process, the call is just a regular java method call.

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3