我有两个Activity类.活动A和活动B.后来我添加了活动C,当用户摇动活动A或活动B上的设备时,它会启动.现在,如果我在活动A和活动B中注册ShakeListener,我可以实现我的目标
但我现在想要的是另一回事,我不想更改活动A和活动B.我想编写一个不同的类,它运行整个应用程序,并为应用程序中的所有活动注册ShakeListener.我怎样才能做到这一点?那应该是什么课?
我尝试扩展broadcastReceiver并在onReceive方法中注册ShakeListener,但使用了BOOT_EVENT,它只在设备启动而不是应用程序启动时才会被触发.所以无法实现我的目标.
然后我被SO用户建议,扩展Application类并在那里注册监听器.现在,侦听器已注册,但现在我需要将当前正在运行的Activity和上下文传递给Activity C.这里我又回到了零,因为我不想在Activity A或B中添加代码. ,AFAIK,在启动任何Activity之前调用Application类,那么是否可以将当前正在运行的Activity放在前台?
然后我想移动代码在Listener本身找到活动.在这里,我还需要了解当前的活动和背景.上下文是应用程序上下文,然后我尝试访问所有当前打开的活动,following this thread.根据版本,代码有点不同.这不是推荐的方式,并给我错误.
这是班级:
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.. }}
当我尝试使用版本低于棒棒糖的设备.它捕获SecurityException.对于具有上述lollipop版本的设备,它提供了我的应用程序的包名称,但不是特定的类.
1实现目标的正确方法是什么?无论我遵循什么方法都是正确的?在这种情况下,我将尝试调试代码以查找活动
2如果没有,我可以通过哪些其他替代方案实现我的目标,即让全球监听器收听应用程序中的任何活动.
3在不改变活动的情况下,它是否可以实现?
请帮忙.
解决方法:
在您的情况下,您需要实现一个服务来在后台监听传感器.浏览文档:Service
您不能只使用broadcastreceiver来完成此任务.
参考:
Android sensor listening when app in background
请参阅此链接以获取帮助:
http://code.tutsplus.com/tutorials/android-barometer-logger-acquiring-sensor-data–mobile-10558
以上是内存溢出为你收集整理的java – 为android中的所有活动注册侦听器的全局类全部内容,希望文章能够帮你解决java – 为android中的所有活动注册侦听器的全局类所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)