在android系统中有标准定义的走下面这个流程:比如音量加减,电源
先找到对应的navigation_bar.xml,添加如下:
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/poweroff"
android:layout_width="100dp" android:paddingStart="25dp" android:paddingEnd="25dp"
android:layout_height="match_parent"
android:layout_weight="0"
android:src="@drawable/ic_sysbar_poweroff"
android:scaleType="centerInside"
systemui:keyCode="142"
/>
这里的systemui:keyCode="142"对应的你要上报的按键键值,我这里用的空闲的F12
base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
在interceptKeyBeforeQueueing方法中添加监听:
case KeyEvent.KEYCODE_F12: {
if (down) {
interceptPowerKeyDown(event, true);
}
break;
}
下面走一下非android系统定义流程:
添加控件
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/poweroff"
android:layout_width="100dp" android:paddingStart="25dp" android:paddingEnd="25dp"
android:layout_height="match_parent"
android:layout_weight="0"
android:src="@drawable/ic_sysbar_poweroff"
android:scaleType="centerInside"
/>
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\navigationBarView.java
public View getPowerButton(){
return mCurrentView.findViewById(R.id.poweroff);
}
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java
onConfigurationChanged----->
repositionNavigationBar---->
mNavigationBarView.getPowerButton().setOnClickListener(mPowerOnClickListener);
View.OnClickListener mPowerOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent();
i.setAction("com.core.systemui.poweroff"); //广播名称
mContext.sendBroadcast(i);
}
};
通过点击发送广播,接收到广播进行操作
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
//接受广播处注册广播
filter = new IntentFilter();
filter.addAction(Intent.ACTION_DREAMING_STARTED);
filter.addAction(Intent.ACTION_DREAMING_STOPPED);
filter.addAction("com.core.systemui.poweroff"); //注册广播
context.registerReceiver(mDreamReceiver, filter);
//如下位置添加监听
BroadcastReceiver mDreamReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_DREAMING_STARTED.equals(intent.getAction())) {
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onDreamingStarted();
}
} else if (Intent.ACTION_DREAMING_STOPPED.equals(intent.getAction())) {
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onDreamingStopped();
} //添加如下代码
} else if ("com.core.systemui.poweroff".equals(intent.getAction())) {
interceptPowerKeyDown(event, true);
}
}
};