Android Studio 开发实践——简易版音游APP(六)
程序员文章站
2022-04-28 18:59:46
...
其他
获得访问内存权限
网络状态/开机状态等普通权限可以直接在manifest里面添加。
访问sd卡等危险权限不仅要在manifest里添加,还要运行时申请,不然会报错危险。
AndroidManifest.xml里添加user-permission:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
活动页面代码:
//if语句检查是否已经授权
if(ContextCompat.checkSelfPermission(MusicActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
//申请权限,名字与manifest里面的一致,1为请求码;需要重写onRequestPermissionsResult的得到申请权限的回调函数
ActivityCompat.requestPermissions(MusicActivity.this,new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE},1
);
//这里是需要先把文件读出来,再处理
}
else{
initMediaPlayer();
}
强制横屏
AndroidManifest.xml里修改screenOrientation实现强制横屏
<activity
android:name=".FourGameActivity"
android:screenOrientation="landscape"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
强制下线(广播)
所有活动继承BaseActivity,在BaseActivity里面定义ForceOffLineReceiver,定义ActivityCollector类,管理所有活动。
主页面没有继承BaseActivity,所以强制下线使其他活动都finish()时会返回主页面。
BaseActivity
package com.example.free.Classes;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);//每生成一个活动,活动管理器就添加该活动
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);//没销毁一个活动,活动管理器就销毁该活动
}
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter=new IntentFilter();//会话过滤器
intentFilter.addAction("force_offline");//设置的全局指令为"force_offline"
ForceOffLineReceiver receiver=new ForceOffLineReceiver();//定义广播接收器(每个继承BaseActivity的都有该广播接收器)
registerReceiver(receiver,intentFilter);//注册该指令的广播接收器
}
class ForceOffLineReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {//这个广播接收器的行为
ActivityCollector.finishAll();//把所有活动finish后,再打开主页面的活动
}
}
}
ActivityCollector
package com.example.free.Classes;
import android.app.Activity;
import java.util.ArrayList;
import java.util.List;
public class ActivityCollector {
public static List<Activity> activities=new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity:activities){
if(!activity.isFinishing())
activity.finish();//结束该活动
}
activities.clear();//活动列表清空
}
}