android窗口
『壹』 Android 輸入法窗口焦點獲取流程(2) ,輸入法窗口和應用窗口綁定
基於Android9.x
Window和Session創建成功後,窗口的下一步流程為獲取焦點
我們看下焦點獲取過程,跟輸入法相關的流程
兩個Activity切換時,對應的狀態變化過程為:
以下是Activity窗口初次獲取焦點的流程
當兩個activity 切換時,失去焦點的窗口調用過程如下:
對應的,獲取焦點的額窗口的調用過程如下:
當B窗口的狀態切換到RESUMED時,當窗口的focus可能變化時,會調用updateFocusedWindowLocked
在該方法中,判斷,如果還沒有執行startInputInner方法,則執行startInputInner方法,否則,直接執行startInputOrWindowGainedFocus方法
主要流程:
1:設置controlFlags的flag為CONTROL_WINDOW_FIRST
2:檢查是否已經執行過startInputInner,沒有的話執行startInputInner-->startInputOrWindowGainedFocus;否則,直接執行startInputOrWindowGainedFocus
兩條路徑,攜帶的startInputReason參數不一樣
主要流程:
1:檢查要啟動和退出的ServedView是否為同一個,如果為同一個,則表示已經執行過startInputInner,則返回false,表示不再執行startInputInner
2:如果獲取焦點的是EditorText,會創建跟IMS通信的mServedInputConnectionWrapper對象
主要流程:
1:創建EditorInfo對象tba,這個參數對TextView布局才有意義,它的初始化是在mServedView的onCreateInputConnection完成實例化的
2:根據EditorInfo創建一個InputConnection對象,輸入法應用通過該對象,完成輸入內容到輸入框的傳遞;ACTIVITY獲取焦點場景,該對象
為null,因為沒有要輸入的對象
startInputOrWindowGainedFocus攜帶的參數
startInputReason = 1
表示,該流程是窗口獲取焦點過程
mClient
應用層創建的IInputMethodClient對象,為服務層提供應用層的各個回調方法
該方法跟應用進程首次創建時Session時,傳遞到IMMS的對象是同一個對象
windowGainingFocus:
應用層的ViewRootImpl$W對象
controlFlags |= CONTROL_START_INITIAL;
表示window窗口剛開始獲取焦點
softInputMode = SOFT_INPUT_ADJUST_RESIZE , 允許調整輸入法窗口,避免被其他窗口遮擋
tba , EditorInfo對象
servedContext
null
missingMethodFlags
ic等於null的情況下,為0
當應用層傳遞的W對象windowToken不為null的時候,則創建windowGainedFocus對象,返回給app
結果返回後,會對IMM的對象進行賦值
如此,進入一個窗口,獲取窗口焦點過程,窗口與輸入法相關的流程,就結束了。
下一篇:輸入法在輸入框彈出流程
Android輸入法(3),彈出流程
『貳』 如何在Android中打開一個窗口
1、 首先在默認工程中新建一個Activity
2、添加動作屬性
在activity_main.xml文件中添加動作動作屬性
android:onClick="OpenNewWindow"
OpenNewWindow是自己取的名字
3、添加動作函數
在MainActivity.java文件中添加:
import android.view.View;
然後在添加:
public void OpenNewWindow(View view){
//打開一個新的窗口
Intent intent = new Intent(this,MainActivity2.class);
startActivity(intent);
Toast.makeText(this, "Toast", Toast.LENGTH_SHORT).show();
}
其中:
Intent intent = new Intent(this,MainActivity2.class);
是定義一個意圖,MainActivity2.class是要打開的窗口
startActivity(intent);
是激活這個意圖
Toast.makeText(this, "Toast", Toast.LENGTH_SHORT).show();
作為調試的時候看的,可以刪除,作用是在屏幕是顯示有沒有啟動這個動作。
請注意,為了讓系統能夠將這個方法與在android:onClick屬性中提供的方法名字匹配,它們的名字必須一致,特別是,這個方法必須滿足以下條件:
公共的
沒有返回值
有一個唯一的視圖(View)參數
使用上述方法添加Activity,在調試的時候需要用Andriod4,在此說明另外一種添加Activity的方法。
雙擊Manifest.xml文件,選中Application選項卡,向下拉,找到Application Nodes,點擊添加,跳出以下對話框:
選擇Activity選項,點擊OK。
然後選中新建的Activity,點擊右邊Name,在彈出的對話框中填入名字就可以了。然後,添加xml文件,名字任意取,當然,最好是同名文件,以後好找,填寫相應文檔既可。
Xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity3" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/AText1" />
</RelativeLayout>
其中RelativeLayout說明是相對布局。
『叄』 android 怎麼實現窗口化並指定位置顯示app
需要3個軟體: - Xposed 安裝器:在下方下載 - Xhalo Floating Window:在下方下載 - Portal (Floating Apps) [BETA] :在下方下載 然後是下一步:1.安裝Xposed安裝器 2.選 框架——安裝 3.重新啟動 4.安裝Xhalo Floating Window 並在Xpose裡面的模塊裡面勾選上,重啟 5.打開Xhalo Floating Window 選擇MOVABLE那項 選擇成Enable,退出 6.安裝最後一個Portal (Floating Apps) [BETA]7.(MIUI V5系統才需要)在設置——應用裡面找到後面兩個軟體,允許顯示懸浮窗 8.打開Portal (Floating Apps) [BETA]軟體,會在屏幕上出現一個小圓點,長按,之後會出現一個扇形的界面,長按裡面的任何一個小塊,就會出現選擇程序的界面,選擇你想要窗口操作的程序即可 9.長按小圓點,點擊一下你想打開的...