2016-07-29 18 views
0

サービスから起動されたアクティビティを作成しようとしています。サービスの可視性から開始されたアクティビティnull

私の問題はこの活動を隠している/表示しています。

活動はそれほど

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

活動のように開始された:私はサービスからMAINVIEWの表示を切り替えるしようとしています

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); 
} 

 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); 

これは次のエラーを生成します。あなたはNull Pointer Exceptionを取得している

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

理由はMAINVIEWは、その使用前に初期化されていなかったです。これは、オブジェクトのinitializeステートメントを保持するActivityのonCreate()メソッドが(Serviceの内部で作成したオーバーレイオブジェクトに関して)呼び出されていないために発生します。 onCreate()メソッドは、Activityが作成されると呼び出されます。 Serviceあなたはあなたの活動にサービスをバインドする必要がある活動とサービス、すなわち間の適切な通信チャネルを作成する必要があるからActivityの非表示()メソッドを呼び出すために

。私は知っている、このアプローチは、コーディング努力のビットが必要ですが、最高のアプローチとそれはあなたのアプリのための完璧な、スムーズな機能を保証します。

+0

これはどんなアクティビティでも機能しますか?それとも、サービスを開始したアクティビティにバインドされていなければなりませんか? – Maclaren

+0

任意のアクティビティをサービスにバインドできます。アクティビティを使わずにバックグラウンドで実行するサービスが必要な場合や、アクティビティの切り替え中にバックグラウンドで継続して実行する必要がある場合は、まずサービスを開始する必要があります。その後、必要なアクティビティにサービスをバインドすることができます。 –

+0

このテクニック(上記のコメントで説明したテクニック)は、両方のテクニックの組み合わせです。1.開始サービスと2.バインドサービス –

関連する問題