2016-07-29 2 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 не отформатирован перед его использованием. Это происходит потому, что метод Activity onCreate(), который содержит инициализирующий оператор объекта, не был вызван (относительно объекта наложения, который вы создали внутри вашего Service). Метод onCreate() вызывается только после создания Activity.

Для вызова метода Hide() в Activity от Service вам необходимо создать правильный канал связи между активностью и службой т.е. вам необходимо затруднительной службой для вашей деятельности. Я знаю, этот подход требует немного усилий по кодированию, но его лучший подход, и это гарантирует вам безупречное и бесперебойное функционирование вашего приложения.

+0

Будет ли это работать на любую деятельность? Или он должен быть связан с деятельностью, которая начала службу? – Maclaren

+0

Любая деятельность может быть привязана к Сервису. Если вам необходимо, чтобы Служба запускалась в фоновом режиме без какого-либо действия или продолжала работать в фоновом режиме при переключении между действиями, вам необходимо сначала запустить службу. Затем вы можете привязать службу к любой требуемой активности. –

+0

Этот метод (тот, который я описал в приведенном выше комментарии) представляет собой комбинацию обоих методов. 1. Начал обслуживание и 2. Связанная служба –

Смежные вопросы