Android Service 에서 Toast 를 사용 하면 문제 해결 방법 을 제대로 표시 할 수 없습니다.

3725 단어 AndroidServiceToast
이 사례 는 안 드 로 이 드 서비스 에서 Toast 를 사용 하면 문 제 를 제대로 표시 하지 못 하 는 해결 방법 을 보 여 준다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
Service 간단 한 연습 을 할 때 Service 의 OnCreate,OnStart,OnDestroy 세 가지 방법 중 모두 Activity 에서 같은 방법 으로 Toast.makeText 를 호출 하고 Acitivy 에서 두 개의 단 추 를 통 해 이 서비스의 onStart 와 onDestroy 방법 을 호출 합 니 다.
DemoService 코드 는 다음 과 같 습 니 다.

@Override
public void onCreate()
{
    super.onCreate();
    Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent,int startId)
{
    super.onStart(intent, startId);
    Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy(){
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show();
}

실행 후 데모 서비스 에 있 는 정보 가 표시 되 지 않 았 습 니 다.
처음에 얻 은 Context 가 정확 하지 않다 고 생각 했 습 니 다.Service 에서 getApplication Context()를 직접 호출 하면 Service 의 Context 를 얻 을 수 있 습 니 다.그러나 자세히 살 펴 보면 Toast 는 주 UI 의 Context 를 받 아야 표시 할 수 있 습 니 다.그래서 찾 아 보 았 습 니 다.Google 은 Toast 에 대한 설명 에서 다음 과 같이 말 했 습 니 다.
“A toast can be created and displayed from an Activity or Service. If you create a toast notification from a Service,it appears in front of the Activity currently in focus.”
(http://developer.Android.com/guide/topics/ui/notifiers/toasts.html)
그러면 이 문장 에 따 르 면 service 에서 만 든 toast 는 Acivity UI 앞에서 초점 을 맞 춰 표 시 됩 니 다.그런데 왜 운행 이 효과 가 없 지?MakeText 방법 을 다시 한 번 확인 해 보 세 요.

역시 Context 의 문제 입 니 다.그래서 toast 가 정상적으로 작 동 하려 면 Activity 의 메 인 스 레 드 에서 실행 해 야 합 니 다.그러면 메 인 스 레 드 UI 의 Context 를 어떻게 얻 습 니까?Handler 를 통 해 사용자 정의 스 레 드 를 주 스 레 드 위 에서 실행 할 수 있 습 니 다.
Toast.show 방법의 src 를 살 펴 보 겠 습 니 다.

public void show() {
    ...
    service.enqueueToast(pkg, tn, mDuration);  //  toast          
    ...
}

원리 적 으로 안 드 로 이 드 는 대체적으로 메시지 큐 와 메시지 순환 이 고 메 인 스 레 드 는 메시지 큐 에서 메 시 지 를 얻 고 처리 합 니 다.Handler 는 메시지 대기 열 에 메 시 지 를 삽입 하 는 도구 클래스 로 간주 합 니 다.그래서 우 리 는 원래 의 코드 를 재 구성 했다.

@Override
public void onCreate()
{
    super.onCreate();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onStart(Intent intent,int startId)
{
    super.onStart(intent, startId);
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show();
      }
    });
}
@Override
public void onDestroy(){
    super.onDestroy();
    handler=new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
      public void run(){
        Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show();
      }
    });
}

실행 후 효 과 는 다음 과 같 습 니 다:

요약:Android Framework 에서 Toast 를 사용 합 니 다.Toast 를 주 스 레 드 에 추가 해 야 정상적으로 작 동 할 수 있 습 니 다.
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기