[安卓] 10、懸浮窗與擷取其他任務資訊

來源:互聯網
上載者:User

標籤:

 

 

這裡介紹的是一個浮動視窗以及用該浮動視窗顯示當前在頂層的應用資訊~一個需要寫2個layout和2個java

 

在MainActivity中主要是那兩個按鈕的的監聽事件,通過Intent啟動和關閉另一個activity.

 1 public class MainActivity extends Activity { 2     @Override 3     public void onCreate(Bundle savedInstanceState) { 4         super.onCreate(savedInstanceState); 5         setContentView(R.layout.main); 6         // FloatingWindowActivity的布局視圖按鈕 7         Button start = (Button) findViewById(R.id.start_id); 8         Button remove = (Button) findViewById(R.id.remove_id); 9         start.setOnClickListener(new OnClickListener() {10             @Override11             public void onClick(View v) {12                 // TODO Auto-generated method stub13                 Intent intent = new Intent(MainActivity.this, FxService.class);14                 startService(intent);15                 finish();16             }17         });18 19         remove.setOnClickListener(new OnClickListener() {20             @Override21             public void onClick(View v) {22                 Intent intent = new Intent(MainActivity.this, FxService.class);23                 stopService(intent);24             }25         });26 27     }28 }

 

另一個FxService則是懸浮窗的全部實現:其中核心都是在createFloatView()函數中實現的,因為在onCreate中調用的是這個函數。在該函數中首先對懸浮窗的一些屬性進行設定,然後寫其觸摸和點擊事件,觸摸事件中主要是移動懸浮窗位置;點擊事件主要是擷取上層活動activity的packageName[80-82],然後根據包名獲得進程名[84-86],下面就是根據獲得的資訊來更新懸浮窗的顯示了並toast.

 1 private void createFloatView() { 2     wmParams = new WindowManager.LayoutParams(); 3     // 擷取WindowManagerImpl.CompatModeWrapper 4     mWindowManager = (WindowManager) getApplication().getSystemService( 5             getApplication().WINDOW_SERVICE); 6     // 設定window type 7     wmParams.type = LayoutParams.TYPE_PHONE; 8     // 設定圖片格式,效果為背景透明 9     wmParams.format = PixelFormat.RGBA_8888;10     // 設定浮動視窗不可聚焦(實現操作除浮動視窗外的其他可見視窗的操作)11     wmParams.flags =12     // LayoutParams.FLAG_NOT_TOUCH_MODAL |13     LayoutParams.FLAG_NOT_FOCUSABLE14     // LayoutParams.FLAG_NOT_TOUCHABLE15     ;16 17     // 調整懸浮窗顯示的固定位置為左側置頂18     wmParams.gravity = Gravity.LEFT | Gravity.TOP;19 20     // 以螢幕左上方為原點,設定x、y初始值21     wmParams.x = 0;22     wmParams.y = 0;23 24     /*25      * // 設定懸浮視窗長寬資料 wmParams.width = 200; wmParams.height = 80;26      */27 28     // 設定懸浮視窗長寬資料29     wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;30     wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;31 32     LayoutInflater inflater = LayoutInflater.from(getApplication());33     // 擷取浮動視窗視圖所在布局34     mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout,35             null);36     // 添加mFloatLayout37     mWindowManager.addView(mFloatLayout, wmParams);38 39     Log.i(TAG, "mFloatLayout-->left" + mFloatLayout.getLeft());40     Log.i(TAG, "mFloatLayout-->right" + mFloatLayout.getRight());41     Log.i(TAG, "mFloatLayout-->top" + mFloatLayout.getTop());42     Log.i(TAG, "mFloatLayout-->bottom" + mFloatLayout.getBottom());43 44     // 浮動視窗按鈕45     mFloatView = (Button) mFloatLayout.findViewById(R.id.float_id);46     mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,47             View.MeasureSpec.UNSPECIFIED), View.MeasureSpec48             .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));49     Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth() / 2);50     Log.i(TAG, "Height/2--->" + mFloatView.getMeasuredHeight() / 2);51     // 設定監聽浮動視窗的觸摸移動52     mFloatView.setOnTouchListener(new OnTouchListener() {53 54         @Override55         public boolean onTouch(View v, MotionEvent event) {56             // TODO Auto-generated method stub57             // getRawX是觸摸位置相對於螢幕的座標,getX是相對於按鈕的座標58             wmParams.x = (int) event.getRawX()59                     - mFloatView.getMeasuredWidth() / 2;60             // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredWidth()/2);61             Log.i(TAG, "RawX" + event.getRawX());62             Log.i(TAG, "X" + event.getX());63             // 25為狀態列的高度64             wmParams.y = (int) event.getRawY()65                     - mFloatView.getMeasuredHeight() / 2 - 25;66             // Log.i(TAG, "Width/2--->" + mFloatView.getMeasuredHeight()/2);67             Log.i(TAG, "RawY" + event.getRawY());68             Log.i(TAG, "Y" + event.getY());69             // 重新整理70             mWindowManager.updateViewLayout(mFloatLayout, wmParams);71             return false;72         }73     });74 75     mFloatView.setOnClickListener(new OnClickListener() {76         @Override77         public void onClick(View v) {//顯示當前是哪個應用在頂層78             // TODO Auto-generated method stub79             pm = getPackageManager();80             am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);81             String packageName = am.getRunningTasks(1).get(0).topActivity82                     .getPackageName();83             try {84                 String progressName = pm.getApplicationLabel(85                         pm.getApplicationInfo(packageName,86                                 PackageManager.GET_META_DATA)).toString();87                 mFloatView = (Button) mFloatLayout88                         .findViewById(R.id.float_id);89                 mFloatView.setText(progressName);90                 Toast.makeText(FxService.this, progressName,91                         Toast.LENGTH_SHORT).show();92             } catch (NameNotFoundException e) {93                 // TODO Auto-generated catch block94                 e.printStackTrace();95             }96         }97     });98 }

注意:如果想獲得系統的TopActivity,還必須獲得許可權:

<uses-permission android:name="android.permission.GET_TASKS" />  

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

 

 

本文連結:http://www.cnblogs.com/zjutlitao/p/4231525.html

更多精彩:http://www.cnblogs.com/zjutlitao/

github:   https://github.com/beautifulzzzz/Android/tree/master/FloatingWindow

 

[安卓] 10、懸浮窗與擷取其他任務資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.