Android Service 에서 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 를 주 스 레 드 에 추가 해 야 정상적으로 작 동 할 수 있 습 니 다.
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.