需要源码请点赞关注收藏后评论区留言~~~
一、竖屏与横屏切换
除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横批两种模式,竖屏时水平方向较短且垂直方向较长,横屏时水平方向较长而垂直方向较短,两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之时,甚至会打乱App的生命周期
由下图可见横屏与竖屏的日志时间不一样,说明App从竖屏变为横屏的时候,整个活动页面又重头创建了一遍,这样不停的重新加载是非常消耗系统资源的。所以Android设计了一种配置变更机制,无须重启活动页面只需执行特定的变更行为即可,分为两步
1:修改AndroidManifest.xml文件
2:修改活动页面的java代码
此处要连接真机比较好进行测试 模拟机没法旋转~~~
代码如下
java类代码
package com.example.chapter09; import androidx.appcompat.app.AppCompatActivity; import android.content.res.Configuration; import android.os.Bundle; import android.widget.TextView; import com.example.chapter09.util.DateUtil; public class ChangeDirectionActivity extends AppCompatActivity { private TextView tv_monitor; // 声明一个文本视图对象 private String mDesc = ""; // 屏幕变更的描述说明 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_direction); tv_monitor = findViewById(R.id.tv_monitor); } // 在配置项变更时触发。比如屏幕方向发生变更等等 @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); switch (newConfig.orientation) { // 判断当前的屏幕方向 case Configuration.ORIENTATION_PORTRAIT: // 切换到竖屏 mDesc = String.format("%s%s %s\n", mDesc, DateUtil.getNowTime(), "当前屏幕为竖屏方向"); tv_monitor.setText(mDesc); break; case Configuration.ORIENTATION_LANDSCAPE: // 切换到横屏 mDesc = String.format("%s%s %s\n", mDesc, DateUtil.getNowTime(), "当前屏幕为横屏方向"); tv_monitor.setText(mDesc); break; default: break; } } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/tv_monitor" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请旋转手机使屏幕在竖屏与横屏之间切换" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
二、回到桌面与切换到任务列表
App不但能检测手机屏幕的方向变更,还能获知回到桌面的事件,连打开任务列表的事件也能实时得知,回到桌面与打开任务列表都由按键触发。因此,若想知晓是否回到桌面,以及是否打开任务列表,都需要收听系统广播 效果如下
可是监听回到桌面的广播能用来干什么呢?一种用处是开启App的画中画模式,比如原先应用正在播放视频,回到桌面时势必要暂停播放,有了画中画模式之后,可将播放界面缩小为屏幕上的一个小方块,这样即使回到桌面也能继续观看视频。
代码如下
Java类代码
package com.example.chapter09; import androidx.appcompat.app.AppCompatActivity; import android.app.PictureInPictureParams; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.util.Rational; import android.widget.TextView; import com.example.chapter09.util.DateUtil; public class ReturnDesktopActivity extends AppCompatActivity { private final static String TAG = "ReturnDesktopActivity"; private TextView tv_monitor; private String mDesc = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_return_desktop); tv_monitor = findViewById(R.id.tv_monitor); initDesktopRecevier(); // 初始化桌面广播 } // 显示变更的状态 private void showChangeStatus(String reason) { mDesc = String.format("%s%s 按下了%s键\n", mDesc, DateUtil.getNowTime(), reason); tv_monitor.setText(mDesc); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isInPictureInPictureMode()) { // 当前未开启画中画,则开启画中画模式 // 创建画中画模式的参数构建器 PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder(); // 设置宽高比例值,第一个参数表示分子,第二个参数表示分母 // 下面的10/5=2,表示画中画窗口的宽度是高度的两倍 Rational aspectRatio = new Rational(10,5); builder.setAspectRatio(aspectRatio); // 设置画中画窗口的宽高比例 // 进入画中画模式,注意enterPictureInPictureMode是Android8.0之后新增的方法 enterPictureInPictureMode(builder.build()); } } // 在进入画中画模式或退出画中画模式时触发 @Override public void onPictureInPictureModeChanged(boolean isInPicInPicMode, Configuration newConfig) { Log.d(TAG, "onPictureInPictureModeChanged isInPicInPicMode="+isInPicInPicMode); super.onPictureInPictureModeChanged(isInPicInPicMode, newConfig); if (isInPicInPicMode) { // 进入画中画模式 } else { // 退出画中画模式 } } // 初始化桌面广播 private void initDesktopRecevier() { desktopRecevier = new DesktopRecevier(); // 创建一个返回桌面的广播接收器 // 创建一个意图过滤器,只接收关闭系统对话框(即返回桌面)的广播 IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(desktopRecevier, intentFilter); // 注册接收器,注册之后才能正常接收广播 } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(desktopRecevier); // 注销接收器,注销之后就不再接收广播 } private DesktopRecevier desktopRecevier; // 声明一个返回桌面的广播接收器对象 // 定义一个返回到桌面的广播接收器 private class DesktopRecevier extends BroadcastReceiver { // 在收到返回桌面广播时触发 @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra("reason"); // 获取变更原因 // 按下了主页键或者任务键 if (!TextUtils.isEmpty(reason) && (reason.equals("homekey") || reason.equals("recentapps"))) { showChangeStatus(reason); // 显示变更的状态 } } } } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <TextView android:id="@+id/tv_monitor" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="请按下主页键或者任务键,然后回到该页面观察结果" android:textColor="@color/black" android:textSize="17sp" /> </LinearLayout>
创作不易 觉得有帮助请点赞关注收藏~~~