Android-Service(系统服务概述 和 桌面浮悬窗,进程管理 等 实例)

1.回顾

    上篇学习了 四大组件之一 Service 包括它的分类,生命周期和 一个音乐播放器的列子来理解 service ;

2.重点

   (1)Android系统服务

   (2)调用系统服务实例

3.Android系统服务

   3.1 Android 系统服务  

            例如:

           (1)ACTIVITY_SERVICE :管理应用程序的系统状态

           (2)WINDOW_SERVICE : 管理打开窗口的程序

           (3) LAYOUT_INFLATER_SERVICE  :布局服务

           (4)POWER_SERVICE : 电源服务

           (5)AlarmManager  :闹钟服务

           (6)NOTIFICATION_SERVICE  :通知栏服务 (前面已经使用过)

           (7)LOCATION_SERVICE  :位置服务

           (8)CONNECTIVITY_SERVICE :网络连接服务

           (9)WIFI_SERVICE  :wifi 服务

          (10)TELEPHONY_SERVICE :电话服务


          这里就列举 这 10 个服务,一会要使用 这10个服务实现 实例;当然 还有 其他服务,不止这10个 ,其他的还有 锁屏服务等等 近27个服务 ;


   3.2 使用

          getSystemService(String name),根据NAME来取得对应的Object,然后转换成相应的服务对象。

4. 实例

   4.1 实例 :浮悬窗 

    (1)使用的系统服务是 :WINDOW_SERVICE

    (2)效果图 :

                                                         

    (3)基本思路

            使用该服务 实现 windowManager 对象 ,后 通过 刚刚学习的 本地服务 Service 使其在 后台 运行即可;

            注意:真机测试,需要在 应用管理中 设置浮选窗权限,默认是关闭的 ,也不提醒 ;

    (4)实现:浮选窗 Service 

  1. package com.example.service;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.graphics.PixelFormat;  
  6. import android.os.IBinder;  
  7. import android.view.Gravity;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.view.WindowManager;  
  11. import android.view.WindowManager.LayoutParams;  
  12. import android.widget.ImageView;  
  13. import android.widget.Toast;  
  14.   
  15. import com.example.systemservicedemo.R;  
  16. import com.example.systemservicedemo.TestActivity;  
  17.   
  18. public class WmanService extends Service {  
  19.   
  20.     @Override  
  21.     public void onStart(Intent intent, int startId) {  
  22.         // 启动 后台服务  
  23.   
  24.         // 启动浮悬框  
  25.         getWindowService();  
  26.   
  27.         super.onStart(intent, startId);  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onDestroy() {  
  32.         // 销毁  
  33.         super.onDestroy();  
  34.     }  
  35.   
  36.     @Override  
  37.     public IBinder onBind(Intent intent) {  
  38.         // TODO Auto-generated method stub  
  39.         return null;  
  40.     }  
  41.   
  42.     /** 
  43.      * WINDOW_SERVICE 管理打开窗口的程序 
  44.      *  
  45.      */  
  46.     private void getWindowService() {  
  47.   
  48.         WindowManager windowManager = (WindowManager) this  
  49.                 .getSystemService(WINDOW_SERVICE);  
  50.   
  51.         LayoutParams params = new LayoutParams();  
  52.         // 布局属性  
  53.         params.type = LayoutParams.TYPE_PHONE;  
  54.         // 同时设置多个属性:悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应  
  55.         // 不可触摸:LayoutParams.FLAG_NOT_TOUCHABLE  
  56.         params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL  
  57.                 | LayoutParams.FLAG_NOT_FOCUSABLE;  
  58.   
  59.         // 设置背景  
  60.         params.format = PixelFormat.RGBA_8888;  
  61.         // 调整悬浮窗口至右侧中间  
  62.         params.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;  
  63.         // 设置左上角为初始值  
  64.         params.x = 0;  
  65.         params.y = 0;  
  66.         // 设置悬浮窗口长宽数据  
  67.         params.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  68.         ;  
  69.         params.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  70.         ;  
  71.         // 加载View  
  72.         // LayoutInflater inflater=getLayoutInflater().from(this);  
  73.         View view = View.inflate(getApplicationContext(),  
  74.                 R.layout.windowmanager, null);  
  75.         ImageView imageView = (ImageView) view.findViewById(R.id.imageView1);  
  76.         // 添加点击事件  
  77.         imageView.setOnClickListener(new OnClickListener() {  
  78.   
  79.             @Override  
  80.             public void onClick(View v) {  
  81.                 // 回到主界面  
  82.                 Toast.makeText(getApplicationContext(), "我是小悬浮,正在跳转。。",  
  83.                         Toast.LENGTH_SHORT).show();  
  84.                 Intent intent = new Intent(getApplicationContext(),  
  85.                         TestActivity.class);  
  86.                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  87.                 startActivity(intent);  
  88.   
  89.             }  
  90.         });  
  91.   
  92.         // 添加到管理器  
  93.         windowManager.addView(view, params);  
  94.   
  95.         // 移除  
  96.         // windowManager.removeView(view);  
  97.     }  
  98.   
  99. }  

       (5)实现: 系统服务 权限设置 

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

       (6)实现:Service 配置

  1. <service android:name="com.example.service.WmanService" >  
  2.         </service>  

      (7)实现 :调用即可

  1. Intent intent=new Intent(MainActivity.this,WmanService.class);  
  2.              startService(intent);  

   4.2 实例:获得系统App运行 进程

     (1)系统服务 :ACTIVITY_SERVICE 

     (2)效果图

                                                           
        

 

        (3)基本思路

                实现ActivityManager 对象 实现 获得系统服务 ;

        (4)实现

  1. /** 
  2.      * ACTIVITY_SERVICE 获得 运行中进程 第一个为当前运行测试的信息 管理应用程序的系统状态 
  3.      */  
  4.     private void getPackageIfo() {  
  5.         // 获取信息  
  6.         ActivityManager activitymanager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);  
  7.         List<RunningAppProcessInfo> infos = activitymanager  
  8.                 .getRunningAppProcesses();  
  9.         String packageInfo = "运行中的进程: \n";  
  10.   
  11.         for (RunningAppProcessInfo info : infos) {  
  12.             packageInfo += info.processName + "\n";  
  13.         }  
  14.         // 显示当前包名  
  15.         Toast.makeText(MainActivity.this"当前包名:" + infos.get(0).processName,  
  16.                 Toast.LENGTH_LONG).show();  
  17.         // 当前运行中的进程  
  18.         tv_show.setText("提示信息:" + packageInfo);  
  19.     }  


5. 由于还有好几个实例 ,此篇幅到此为止

    还有8个 调用系统服务 实例:定位的实现 ,等 和 demo 下载 在下篇 ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的实现示例: 1. 新建一个Vue组件,命名为"NewTab",包含一个按钮和一个弹出框: ``` <template> <div> <el-button type="primary" @click="showDialog">新标签</el-button> <el-dialog title="新标签" :visible.sync="dialogVisible" :modal-append-to-body="false" :close-on-click-modal="false" :destroy-on-close="true" :custom-class="'new-tab-dialog'" :style="{position: 'fixed', top: dialogTop + 'px', left: dialogLeft + 'px', width: dialogWidth + 'px', height: dialogHeight + 'px'}" :before-close="beforeCloseDialog" > <div class="new-tab-content"> // 在这里添加您自己的内容 </div> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, dialogTop: 100, dialogLeft: 100, dialogWidth: 400, dialogHeight: 300, } }, methods: { showDialog() { this.dialogVisible = true; }, beforeCloseDialog(done) { // 清空弹出框的内容,防止下次打开时出现残留 this.$nextTick(() => { const dialogContent = this.$el.querySelector('.new-tab-content'); if (dialogContent) { dialogContent.innerHTML = ''; } done(); }); }, }, mounted() { // 监听浏览器tab页切换事件,实现悬浮窗口的移动 window.addEventListener('focus', () => { const activeElement = document.activeElement; if (activeElement && activeElement.tagName === 'IFRAME') { const rect = activeElement.getBoundingClientRect(); this.dialogTop = rect.top; this.dialogLeft = rect.left; } }); }, } </script> <style scoped> .new-tab-dialog .el-dialog__body { overflow: hidden; } .new-tab-content { height: 100%; overflow: auto; } </style> ``` 2. 在需要使用该组件的页面中引入并使用: ``` <template> <div> // 其他内容 <new-tab></new-tab> </div> </template> <script> import NewTab from '@/components/NewTab'; export default { components: { NewTab, }, } </script> ``` 以上代码使用了Element UI组件库中的Button和Dialog组件,并且使用了Vue的响应式数据来控制弹出框的显示状态和位置。在mounted钩子函数中监听了浏览器的tab页切换事件,实现了悬浮窗口的移动。您可以根据自己的需求修改样式和事件处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值