android get OnTouchEvent即使应用程序未激活,java空指针

android get OnTouchEvent即使应用程序未激活,java空指针,java,android,view,nullpointerexception,uigesturerecognizer,Java,Android,View,Nullpointerexception,Uigesturerecognizer,我尝试制作一个应用程序,witch也会收听触摸事件,即使它在后台运行,我在论坛中找到了一个解决方案,但我无法让它运行 如果我理解正确,那么实现这一点的方法就是使用正确的windowmanager参数设置一个新视图,下面是我的代码 主要活动: public class MainActivity extends Activity { View mView; HUD mHud; HUDView mHUDView; @Override protected

我尝试制作一个应用程序,witch也会收听触摸事件,即使它在后台运行,我在论坛中找到了一个解决方案,但我无法让它运行

如果我理解正确,那么实现这一点的方法就是使用正确的windowmanager参数设置一个新视图,下面是我的代码

主要活动:

public class MainActivity extends Activity {


    View mView;
    HUD mHud; 
    HUDView mHUDView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mHud = new HUD();
        mHUDView = new HUDView(this);

    }


    @Override
    public boolean onTouchEvent(MotionEvent e) {
        mHud.onCreate(this);
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
目前,为了测试,我只想改变视图,第一次触摸

public class HUD extends Service  {

    HUDView mView;

    public void onCreate(Context mContext) {
        super.onCreate();

        mView = new HUDView(this);
                WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);

        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

}



class HUDView extends ViewGroup {

    public HUDView(Context context) {
        super(context);  
    }


    @Override
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("ontouch", "clicked in the HUD View");
        //Toast.makeText(getContext(),"onTouchEvent", Toast.LENGTH_LONG).show();
        return true;
    }
}
我对java不是很有信心,我得到的错误是javaNullPointerException错误。我知道发生这种情况是因为对象变为null,但是我如何将对象传递给类和子类呢

以下是日志:

11-18 11:56:03.791: E/AndroidRuntime(5095): FATAL EXCEPTION: main
11-18 11:56:03.791: E/AndroidRuntime(5095): java.lang.NullPointerException
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.view.View.<init>(View.java:1810)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.view.ViewGroup.<init>(ViewGroup.java:288)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at com.holzi.runinbackground.HUDView.<init>(HUD.java:47)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at com.holzi.runinbackground.HUD.onCreate(HUD.java:22)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at com.holzi.runinbackground.MainActivity.onTouchEvent(MainActivity.java:32)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.os.Looper.loop(Looper.java:143)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at android.app.ActivityThread.main(ActivityThread.java:4914)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at java.lang.reflect.Method.invokeNative(Native Method)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at java.lang.reflect.Method.invoke(Method.java:521)
11-18 11:56:03.791: E/AndroidRuntime(5095):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
谢谢

您要将其作为上下文传递给HUDView,这是您的服务,它在连接之前没有基本上下文,因此在调用getResources时将抛出


您需要等待,直到调用,或者使用另一个上下文来实例化HUDView,而不是服务,可能是上下文。

这里是完整的工作代码,用于记录手机上的任何触摸,由不可见的系统警报覆盖捕获

public class InvisibleView extends Service {

    View myView;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    public void onCreate(Context myContext) {
       super.onCreate();

       LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
       myView = new View(myContext);
       myView = inflater.inflate(R.layout.invisibleviewxml, null);

       WindowManager.LayoutParams params = new WindowManager.LayoutParams(
               WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
               WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
               PixelFormat.TRANSLUCENT);

        WindowManager wm = (WindowManager) myContext.getSystemService(WINDOW_SERVICE);
        wm.addView(myView, params);


        myView.setOnTouchListener( new OnTouchListener() {
            @Override
            public boolean onTouch(View inviView, MotionEvent event) {
               Log.d("tag",  "touch caught by invisble running service");
                return true;
            }

        });


    }

  @Override
    public void onDestroy() {
        super.onDestroy();
        if(myView != null)
        {
            ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(myView);
            myView = null;
        }
    }

}
主要活动:

public class MainActivity extends Activity {

    InvisibleView myInvisibleView; 


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myInvisibleView = new InvisibleView(); 
        loadInvisibleView();
        sendScreenHome();
    }
     private void loadInvisibleView(){
         myInvisibleView.onCreate(this.getApplicationContext());
     }

    private void sendScreenHome(){
        Intent homeIntent= new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory(Intent.CATEGORY_HOME);
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(homeIntent);

    }

}
不可见视图XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="programm is running ..."
        android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

谢谢,如果我没听错的话,比如mContext=getApplication;mView=新的HUDViewmContext;但是我仍然得到了NullPointerException,但是在这个错误行11-18 17:53:11.071:E/AndroidRuntime5763:at android.view.ViewConfiguration.getViewConfiguration.java:211i中,我遵循了相同的方法,但无法在myview上获得toych或单击事件