欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();//活动列表清空
    }

}