开发环境:Android9.0 API28 AS3.3.2
测试日期:2019年6月26日 19:22:58
—开始需要加入两种权限
AndroidManifest.xml
<!-- 获取网速所需要的权限 -->
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<!-- 悬浮窗所需要的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
—之后在MainActivity里检查权限并开启服务
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFloatBall(); // 悬浮球模块
}
/**
*
* @param context 传进来要从当前哪个活动开启服务
*/
private void addWatchingService(Context context){
Intent intent = new Intent(context,GetNetSpeedService.class);
startService(intent);
}
/**
* 初始化悬浮窗权限,允许应用出现在其他窗口之上
*/
private void initFloatBall(){
//检查权限是否开启
if(Settings.canDrawOverlays(MainActivity.this)){
addWatchingService(MainActivity.this);
finish();
}else{
Toast.makeText(MainActivity.this,"请先打开权限",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivityForResult(intent,1);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
//判断回调情况
case 1:
if(!Settings.canDrawOverlays(MainActivity.this)){
Toast.makeText(MainActivity.this,"获取权限失败",Toast.LENGTH_SHORT);
finish();
}else{
initFloatBall();
}
}
}
}
—在layout文件下创建悬浮窗的布局floatball.xml
图片资源在源代码里找
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dp"