活动从服务可见性null开始

时间:2016-07-29 02:43:02

标签: android

我正在尝试从服务启动活动。

我的问题是隐藏/显示此活动。

活动就像这样开始

        overlay = new BubbleOverlay();
    Intent intent = new Intent(this, overlay.getClass()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

的活动:

public class BubbleOverlay extends Activity {

private boolean active = false;
private View mainView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.overlay_layout);
    mainView = findViewById(R.id.main_overlay_layout);
    if(mainView == null)
        Log.d("BubbleOverlay", "onCreate: MainView is null");
}

public void setActive(boolean value){
    active = value;
}

public void hide(){
    active = false;
    mainView.setVisibility(View.INVISIBLE);
}

public void show(){
    active = true;
    mainView.setVisibility(View.VISIBLE);
}

我正在尝试从服务中切换mainView的可见性。

        Handler handler = new Handler();
    Runnable runnable_longClick = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            overlay.hide();
        }
    };
    handler.postDelayed(runnable_longClick, 5000);

这会产生以下错误:

07-28 05:51:56.549 21690-21690/com.derp.derp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.derp.derp, PID: 21690
                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference
                                                                      at com.derp.derp.BubbleOverlay.hide(BubbleOverlay.java:37)
                                                                      at com.derp.derp.BubbleService$4.run(BubbleService.java:181)
                                                                      at android.os.Handler.handleCallback(Handler.java:751)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6044)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

1 个答案:

答案 0 :(得分:0)

您获取Null Pointer Exception的原因是mainView在使用之前尚未初始化。发生这种情况是因为没有调用包含对象初始化语句的Activity onCreate()方法(相对于您在Service中创建的覆盖对象)。只有在创建Activity后才会调用onCreate()方法。

为了从Activity调用Service的hide()方法,您需要在Activity和Service之间创建一个正确的通信通道,即您需要绑定服务到您的活动。我知道,这种方法需要一些编码工作,但它是最好的方法,它将保证您的应用程序完美无瑕,顺畅运行。