2016-07-29 106 views
0

我正在嘗試從服務啓動活動。從服務可見性開始的活動null

我的問題是隱藏/顯示此活動。

活動開始像這樣

 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) 

回答

0

你得到Null Pointer Exception原因是它的MainView使用前尚未初始化。發生這種情況的原因是尚未調用保存對象初始化語句的活動的onCreate()方法(相對於您在Service中創建的疊加層對象)。只有創建了Activity後,纔會調用onCreate()方法。

爲了從調用Activity的獸皮()方法Service需要創建活動和服務,即需要綁定服務到您的活動之間的適當通信信道。我知道,這種方法需要一些編碼工作,但它是最好的方法,它會保證您的應用程序無縫且平穩地運行。

+0

這是否適用於任何活動?還是它必須被綁定到啓動服務的活動? – Maclaren

+0

任何活動都可以綁定到服務。如果您需要服務在沒有任何活動的情況下在後臺運行,或者在活動之間切換時繼續在後臺運行,則需要先啓動服務。然後,您可以將服務綁定到您想要的任何活動。 –

+0

這種技術(我在上面的評論中描述的技術)是技術的組合。1.啓動服務和2.綁定服務 –