Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于注册android中所有活动的侦听器的全局类_Java_Android - Fatal编程技术网

Java 用于注册android中所有活动的侦听器的全局类

Java 用于注册android中所有活动的侦听器的全局类,java,android,Java,Android,我有两个活动课活动A和活动B。后来,我添加了活动C,当用户晃动正在进行活动A或活动B的设备时,会启动该活动。现在,如果我在活动A和活动B中注册ShakeListener,我就可以实现我的目标了 但我现在想要的是另一件事,我不想改变活动a和活动B。我想编写一个不同的类,它为整个应用程序运行,并为应用程序中的所有活动注册ShakeListener。我该怎么做?那应该是什么样的课 我尝试扩展BroadcastReceiver并在onReceive方法中注册ShakeListener,但使用了BOOT_

我有两个活动课<代码>活动A和
活动B
。后来,我添加了
活动C
,当用户晃动正在进行
活动A
活动B
的设备时,会启动该活动。现在,如果我在
活动A
活动B
中注册ShakeListener,我就可以实现我的目标了

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

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

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

然后我想移动代码以在侦听器本身中找到活动。在这里,我还需要获得当前的活动和上下文。上下文是应用程序上下文,然后我尝试访问所有当前打开的活动。根据版本,代码有点不同。这不是推荐的方法,给了我一个错误

这是一节课:

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


}
package com.something.something;
导入android.app.Activity;
导入android.app.ActivityManager;
导入android.content.ComponentName;
导入android.content.Context;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.os.Build;
导入android.util.Log;
导入java.lang.reflect.Field;
导入java.util.List;
/**
*由Inquisitive于2015年5月20日创建。
*/
公共类ShakeEventListener实现了SensorEventListener{
私人语境;
私人活动;
私有字符串[]getPreLollipop(){
试一试{
@抑制警告(“弃用”)
列出任务=
activityManager().getRunningTasks(1);
ActivityManager.RunningTaskInfo currentTask=tasks.get(0);
ComponentName currentActivity=currentTask.topActivity;
返回新字符串[]{currentActivity.getClassName()};
}
捕获(例外e){
Log.d(“版本”、“异常”+e.getClass());
字符串str[]={“abc”,“def”};
返回str;
}
}
私有字符串[]getLollipop(){
最终int过程\状态\顶部=2;
试一试{
Field processStateField=ActivityManager.RunningAppProcessInfo.class.getDeclaredField(“processState”);
列出进程=
activityManager().GetRunningAppProcess();
for(ActivityManager.RunningAppProcessInfo进程:进程){
如果(
//过滤掉大多数非活动流程

process.importance创建一个主要活动类别,该类别将由活动a、B和C扩展。
您可以在此主活动中注册您的
ShakeListener

您可以在应用程序类中定义自己的ActivityStack,通过添加和删除活动进行适当管理。最后从activity C中引用此堆栈

下面是ActivityStack的工作原理示例:

在您的情况下,您需要实施一项服务,以便在后台监听传感器。查看文档:

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

参考:

请参阅此链接以获取帮助:

感谢您的及时回复。为了扩展,我还需要在活动a、B和C中编写代码,以从ShakeActivity进行扩展?我没有更改活动的权限。那么如何在活动a、B或C中扩展ShakeActivity?其中ShakeActivity是从其他活动扩展类时我已注册ShakeListener的活动,y将父级代码添加到子级。如果您有一个ShakeActivity类,该类具有与sake相关的代码,然后您创建了一个扩展ShakeActivity的MainActivity,则MainActivity有自己的代码,也有ShakeActivitycode@JesusS为了使其工作,我需要在MainActivity中添加此代码,MainActivity扩展了ShakeActivity。这是我没有的要做。我不想更改MainActivity代码。你是否尝试过使用服务wit BroadcastReceiver和PendingEvent?@Shahzeb我尝试过使用广播接收器,但出于目的使用了BOOT。我不知道如何将其与PendingEvent一起使用。你能推荐一些好的资源吗?我将查看服务类。尽管我不想让传感器听当应用程序在后台运行时,我希望它只在应用程序的活动A和B在前台启动不同的android活动时才进行监听,比如说照相机意图之类的。你可以只在应用程序运行时允许你的服务运行,在应用程序停止时停止服务。熟悉它,这将非常有帮助ulnice链接。我能在服务类中获取当前正在运行的活动吗?是的,当然,实际上有两种类型的服务,绑定和启动。绑定是当您将组件与服务绑定时。当您阅读android文档时,您将了解这一点谢谢,我能通过应用程序绑定服务并获得当前运行吗服务中的活动/上下文?