全局类为android中的所有活动注册监听器

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

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

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

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

然后我想移动代码在Listener本身找到活动。 在这里,我还需要了解当前的活动和背景。 上下文是应用程序上下文,然后我尝试访问所有当前打开的活动, 遵循此线程 。 根据版本,代码有点不同。 这不是推荐的方式,并给我错误。

这是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 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 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.. } } 

当我尝试使用版本低于棒棒糖的设备。 它捕获SecurityException。 对于具有上述lollipop版本的设备,它提供了我的应用程序的包名称,但不是特定的类。

1实现目标的正确方法是什么? 无论我采用什么方法都是正确的? 在这种情况下,我将尝试调试代码以查找活动

2如果没有,我可以通过哪些其他替代方案实现我的目标,即让全球监听器收听应用程序中的任何活动。

3在不改变活动的情况下,它是否可以实现?

请帮忙。

在您的情况下,您需要实现一个服务来在后台监听传感器。 浏览文档: 服务

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

参考:

安卓传感器在后台应用时收听

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

创建一个主活动类,它将由活动A,B和C扩展。您可以在此主活动中注册ShakeListener

您可以在Application类中定义自己的ActivityStack,通过添加和删除活动来正确管理。 最后从活动C中引用此堆栈。

有一个示例ActivityStack的工作原理: Back Stack Example