5

내 응용 프로그램이 URL에서 파일을 다운로드하는 AsyncTask을 시작합니다. 동시에 사용자에게 다운로드 완료율을 알려주는 상태 표시 줄 Notification을 생성합니다.Android : 상태 표시 줄 알림으로 생성 된 PendingIntent에서 AsyncTask에 액세스하려면 어떻게해야합니까?

알림을 클릭하면 내 애플리케이션이 응답하게하려고합니다. 다운로드가 아직 진행 중이면 다운로드를 중지할지 묻는 DialogInterface을 표시하려고합니다. 예를 클릭하면 다운로드를 중지해야합니다.

문제는 내가 알림을 설정하는 PendingIntent에서 내 비동기 작업에 액세스하는 방법을 모르겠다는 것입니다. DialogInterface을 쉽게 표시 할 수는 있지만 다운로드를 중지 할 위치에서 수행 할 활동을 표시하는 방법을 모르겠습니다.

다운로드 할 수있는 파일을 참조하는 File 객체뿐 아니라 알림에 액세스 할 수있는 Helper 클래스를 만들려고했지만 객체가 직렬화되지 않는다는 오류가 발생합니다 (Serializable 구현). 도우미 클래스에는 대화 상자를 표시할지 여부에 대한 조건에 사용할 다운로드 진행률을 보유하는 멤버도 포함되었습니다.

나는 Brodcast 액션과 리시버를 사용할 생각 이었지만 리시버를 어디에 둘지는 잘 모르겠습니다. AsyncTask을 확장하는 수업에 포함 되나요?

도움을 주시면 감사하겠습니다. Notification에 첨부 된 PendingIntent입니다. 더 많은 코드를 보려면 그냥 물어보십시오.

분명히 말해서 나는 ViewDetailActivity 클래스를가집니다. 내부 클래스는 DownloadFile이고, 확장자는 AsyncTask이며 사용자가 화면의 버튼을 클릭 할 때 실행됩니다. doInBackground() 메서드가 DownloadFile 인 경우 URL에서 mp3 다운로드가 시작되고 다운로드 한 파일의 양을 기준으로 상태 표시 줄 Notification이 만들어지고 업데이트됩니다. NotificationPendingIntentDownloadNotificationActivity (코드가 표시됨)으로 만들어지며 "예"가 선택된 대화 상자가 표시되어 AsyncTask에서 다운로드를 취소해야합니다.

내 문제는 DownloadFile 작업에 다운로드가 취소되었음을 알리고이를 취소하기 위해 DownloadNotificationActivity에서 DownloadFile에 액세스하는 방법을 모르겠다는 것입니다.

미리 감사드립니다.

답변

1

asynctask에서 doInBackground()에있는 isCancelled()을 확인하고 취소 할 때 중단해야합니다. 귀하의 신고서에서 asynctaskcancel()으로 전화하십시오.

이렇게하려면 AsyncTask에 대한 참조를 알림 활동에 전달해야합니다.예를 들어

:

이 같은 AsyncTask를 만들기 : 주 Activity에서 다음

class MyAsyncTask extends AsyncTask<Void, Integer, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { //be sure to check isCancelled here, i.e. if (isCancelled()) break; 

가 만든 AsyncTask 같은 : 당신은 통지를 만드는 그런

public class MyActivity extends Activity { 
    private MyAsyncTask zeTask; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
       zeTask= new MyAsyncTask(); 
       zeTask.execute(); 

, 비동기 작업을 취소하려면 zeTask로 참조하십시오. MyAsyncTask는 알림과 동일한 액티비티에 있어야하며 zeTask는 AsyncTask에 대한 참조를 보유하는 변수가 될 수 있습니다.

switch (which) { 
       case DialogInterface.BUTTON_POSITIVE : 
        zeTask.cancel(); 
        finish(); 
        break; 
+0

위의 활동에 실제로 'AsyncTask'참조를 전달하는 것이 문제입니다. 나는'AsyncTask'에'Serializable'을 구현하고'PendingIntent'로 설정 한'Intent'에'putExtra()'를 사용하려했지만 객체가 직렬화 가능하지 않다는 예외가있었습니다. AsyncTask에 대한 참조를 내 활동에 전달하는 또 다른 방법이 있습니까? – Shino

+0

좋아, 내가하고있는 방식대로 작동하지 않을 것 같아. 내가 게시 한 알림 작업은 상태 표시 줄 알림을 클릭했을 때만 'PendingIntent'로 사용하기위한 것입니다. AsyncTask는 실제로 파일을 다운로드하기 위해 클릭 할 수있는 화면을 처리하는 클래스에있었습니다. 내 AsyncTask를'DownloadNotificationActivity'로 옮기고 그 클래스의'onCreate'에서 실행할 필요가있는 것 같습니다. 그런 다음 알림을 위해'onClick' 이벤트를 처리하십시오. 무슨 일이 일어나는지 알려 드리겠습니다. – Shino

+0

이전 의견에서 제가 말한 것을 시도해 보았습니다. 당신의 도움에 감사드립니다. @Motes. 더 많은 정보 (하단)로 주제를 업데이트했습니다. 나는 이것이 잘못된 방향으로 가고있는 것처럼 느낍니다. 다른 옵션을 찾아야합니다. 나는'Broadcast'와'BraodcastReceiver'를 시도해 볼 생각 이었지만,'AsyncTask'에 수신기를 얼마나 잘 작동시키는 지 잘 모르겠습니다. – Shino