gpt4 book ai didi

java - 为 android 中的所有 Activity 注册监听器的全局类

转载 作者:行者123 更新时间:2023-12-02 04:39:25 26 4
gpt4 key购买 nike

我有两个 Activity 类。 Activity A Activity B。后来我添加了Activity C,当用户在Activity AActivity B上摇动设备时,它就会启动。现在,如果我在 Activity AAcitivity B 中注册 ShakeListener,我就可以实现我的目标

但我现在想要的是不同的东西,我不想更改Activity AActivity B。我想编写一个不同的类,它为整个应用程序运行,并为应用程序中的所有 Activity 注册 ShakeListener。我怎样才能做到这一点?那应该是一个什么样的类?

我尝试扩展 BroadcastReceiver 并在 onReceive 方法中注册 ShakeListener,但使用了 BOOT_EVENT,它仅在设备启动时触发,而不是在应用程序启动时触发。所以无法实现我的目标。

然后,一位 SO 用户建议我扩展 Application 类并在那里注册监听器。现在监听器已注册,但现在我需要将当前运行的 Activity 和上下文传递给 Activity C。在这里我又回到零,因为我不想在 Activity A 或 B 中添加代码。另外,据我所知,Application 类在任何 Activity 启动之前被调用,所以是否有可能获取当前的在前台运行 Activity?

然后我想移动代码以查找监听器本身中的 Activity 。在这里我还需要获取当前的 Activity 和上下文。上下文是应用程序上下文,然后我尝试访问所有当前打开的 Activity ,following this thread 。根据版本的不同,代码略有不同。这不是推荐的方法,并且给了我错误。

这是类(class):

package com.something.someotherthing;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.os.Build;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.List;

/**
* Created by Inquisitive on 20/5/15.
*/
public class ShakeEventListener implements SensorEventListener {

private Context context;
private Activity activity;


private String[] getPreLollipop() {
try {
@SuppressWarnings("deprecation")
List<ActivityManager.RunningTaskInfo> tasks =
activityManager().getRunningTasks(1);
ActivityManager.RunningTaskInfo currentTask = tasks.get(0);
ComponentName currentActivity = currentTask.topActivity;
return new String[]{currentActivity.getClassName()};
}
catch(Exception e){
Log.d("version","Exception" +e.getClass());
String str[]= {"abc","def"};
return str;
}
}

private String[] getLollipop() {
final int PROCESS_STATE_TOP = 2;

try {
Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");

List<ActivityManager.RunningAppProcessInfo> processes =
activityManager().getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo process : processes) {
if (
// Filters out most non-activity processes
process.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&&
// Filters out processes that are just being
// _used_ by the process with the activity
process.importanceReasonCode == 0
) {
int state = processStateField.getInt(process);

if (state == PROCESS_STATE_TOP)
/*
If multiple candidate processes can get here,
it's most likely that apps are being switched.
The first one provided by the OS seems to be
the one being switched to, so we stop here.
*/
return process.pkgList;
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}

return new String[] { };
}

private ActivityManager activityManager() {
return (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
}


public String[] get() {
if (Build.VERSION.SDK_INT < 21) {
Log.d("Version","Pre-lollipop");
for(String str:getPreLollipop())
Log.d("Version",str);
return getPreLollipop();
}
else {
Log.d("Version","Lollipop");
for(String str:getLollipop())
Log.d("Version",str);
return getLollipop();
}
}
public ShakeEventListener(Context context){
Log.d("ACCELEROMETER","inside the constructor of shake event listener");
this.context=context;
String str[] = get();
try {
Class<?> myClass = Class.forName(str[0]);
activity = (Activity) myClass.newInstance();
}catch(Exception e){
//do something
}

}
public void onAccuracyChanged(Sensor sensor, int accuracy){

}
public void onSensorChanged(SensorEvent se){
Log.d("SENSOR","On sensor changed");

//need the activity and context here..
}


}

当我尝试使用版本低于 Lollipop 的设备时。它捕获 SecurityException。对于版本高于 Lollipop 的设备,它给出了我的应用程序的包名称,但不是特定的类。

1实现我的目标的正确方法是什么?我遵循的任何方法都是正确的吗?在这种情况下,我将尝试调试代码以查找 Activity

2如果没有,我可以通过哪些其他替代方案来实现拥有一个全局监听器来监听应用程序内任何 Activity 的目标。

3在不改变 Activity 的情况下是否可以实现?

请帮忙。

最佳答案

就您而言,您需要实现一项服务来在后台监听传感器。浏览文档:Service

您不能仅使用 Broadcastreceiver 来完成此任务。

引用:

Android sensor listening when app in background

请参阅此链接寻求帮助: http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data--mobile-10558

关于java - 为 android 中的所有 Activity 注册监听器的全局类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com