android - 关闭电源断开的 Activity

标签 android android-activity broadcastreceiver

我编写了一个用于循环播放单个视频的小应用程序。我怎么能意识到,设备在连接电源并再次关闭 Activity 时唤醒并播放此视频。在此之后,还应关闭屏幕以避免耗尽电池电量。

实际代码如下:

package org.adem.receiver;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.util.Log;
import org.adem.activities.AdvertiserActivity;
import org.adem.global.GlobalVariables;

public class AppReceiver extends BroadcastReceiver {

    private static final String TAG = AppReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_POWER_CONNECTED.equals(intent.getAction())) {
            Log.d(TAG, "##Receiver triggered with " + intent.getAction());
            if (!checkForRunningActivity(context)) {
                initStart(context);
                Intent advertiserIntent = new Intent(context, AdvertiserActivity.class);
                advertiserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                Log.d(TAG, "##Activity started" + advertiserIntent.getComponent().getShortClassName());
                context.startActivity(advertiserIntent);
            } else {
                Log.d(TAG, "##" + intent.getAction() + " received but ignored. Activity still running.");
            }
        } else if (Intent.ACTION_POWER_DISCONNECTED.equals(intent.getAction())) {
            Log.d(TAG, "##Receiver triggered with " + intent.getAction());
            stopAllAndTurnOff(context);

            Log.d(TAG, "##" + intent.getAction() + " received but ignored. Activity is not running.");
        }

    }

    private void initStart(Context context) {
        getWakeLock(context).acquire();
        GlobalVariables.DEVICE_READY = true;
        getKeyGuardLock(context).disableKeyguard();
        Log.d(TAG, "##Wake Lock acquired");
    }

    private void stopAllAndTurnOff(Context context) {
        GlobalVariables.DEVICE_READY = false;

        if (getWakeLock(context).isHeld()) {
            getWakeLock(context).release();
            Log.d(TAG, "##Wake Lock released");
        }
    }

    private KeyguardManager.KeyguardLock getKeyGuardLock(Context context) {
        if (GlobalVariables.getLock() == null) {
            KeyguardManager.KeyguardLock lock;
            KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Activity.KEYGUARD_SERVICE);
            lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE);
            GlobalVariables.setLock(lock);
            Log.d(TAG, "##New KeyGuard initialized");
        }
        return GlobalVariables.getLock();
    }

    private PowerManager.WakeLock getWakeLock(Context context) {
        if (GlobalVariables.getWl() == null) {
            PowerManager.WakeLock wl;
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
            GlobalVariables.setWl(wl);
            Log.d(TAG, "##New Wake Lock initialized");
        }
        return GlobalVariables.getWl();
    }

    private boolean checkForRunningActivity(Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
        for (ActivityManager.RunningTaskInfo task : manager.getRunningTasks(Integer.MAX_VALUE)) {
            Log.d(TAG, task.baseActivity.getClassName());
            if (task.baseActivity.getClassName().equals("org.adem.activities.AdvertiserActivity")
                    || task.baseActivity.getClassName().equals("org.adem.activities.VideoViewActivity")) {
                return true;
            }
        }
        return false;
    }
}

当我在真实设备上测试它时,它每次都说 Activity 仍在运行。但是为什么?

谢谢

亚当

最佳答案

您可以添加广播接收器以接收电池变化。

获取 Intent.ACTION_BATTERY_CHANGED 的响应

Intent batteryIntent = context.getApplicationContext().registerReceiver(null,
                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

接收方收到后检查连接。

插电/充电:

安卓USB连接

public static boolean isConnected(Context context) {
    Intent intent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB;
}

在 list 文件中添加权限:

android.permission.DEVICE_POWER

关于android - 关闭电源断开的 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215521/

相关文章:

android - 如何防止用户从主菜单重定向到登录 Activity (MainActivity)

java - 无法将值从一个 Intent 传递到另一个 Intent

android - 有条件地从 Android 中的通知重启 Activity

java - 一种让我的 BroadcastReceiver 阻止系统广播的方法?

android - Android 上的警报通知

android - 如何将 IntentService 的结果返回到 Activity?

android - Activity 已泄漏 IntentReceiver 错误

Android自定义 Intent 过滤器未接收广播?

java - 我可以动态修改对话框的布局吗?

android - 如何以编程方式打开和关闭键盘的预测文本选项