0

Android에서 홈 스크린 위젯을 만드는 법을 배우고 있습니다. 이 코드는 RingerMode를 NORMAL에서 SILENT로 또는 그 반대로 전환하는 앱 위젯 용 코드입니다.이 앱 위젯 스 니펫에있는 모든 인 텐트 (PendingIntents)의 논리적 흐름

괜찮 으면 좋겠지 만 논리적 인 흐름 (즉, 시작될 때, 시작되는 곳,가는 곳, 끝나는 곳, 종료 할 때까지)에 대한 모든 정보가 필요합니다.

이 주제를 분명히 이해하도록 도와주세요. 여전히

package com.dummies.android.silentmodetoggle; 

import android.app.Activity; 
import android.app.IntentService; 
import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.util.Log; 
import android.widget.RemoteViews; 

public class AppWidget extends AppWidgetProvider { 

public static String tag ="SilentModeToggleWidget"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    Log.d(tag, "onReceive() first line"); 


    if(intent.getAction()==null) 
    { 
     //Do Something 
     Log.d(tag, "before startService()"); 
     context.startService(new Intent(context, ToggleService.class)); 
    } 
    else{ 
     super.onReceive(context, intent); 
    } 



} 


@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Do something in specified intervals 
    context.startService(new Intent(context, ToggleService.class)); 
} 

public static class ToggleService extends IntentService{ 

    public ToggleService(){ 

     super("AppWidget$ToggleService"); 

     Log.d(tag, "In ToggleService construcor"); 
    } 

    @Override 
    protected void onHandleIntent(Intent arg0) { 

     Log.d(tag, "In ToggleService > onHandleIntent"); 

     // TODO Auto-generated method stub 
     ComponentName cn = new ComponentName(this, AppWidget.class); 
     AppWidgetManager mgr = AppWidgetManager.getInstance(this); 

     mgr.updateAppWidget(cn, buildUpdate(this)); 

    } 


    private RemoteViews buildUpdate(Context context){ 
     RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget); 

     AudioManager audioManager = (AudioManager)context.getSystemService(Activity.AUDIO_SERVICE); 

     if(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT){ 
      updateViews.setImageViewResource(R.id.phoneState, R.drawable.phone_on); 
      audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
     } 

     else{ 
      updateViews.setImageViewResource(R.id.phoneState, R.drawable.phone_silent); 
      audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
     } 


     Intent i = new Intent(this, AppWidget.class); 

     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 

     updateViews.setOnClickPendingIntent(R.id.phoneState, pi); 

     return updateViews; 

} 

} 

} 
+1

"수명주기의 의도"를 클릭 할 때 다른 동작이 시작될 것임을 의미합니다. 죄송합니다. 인 텐트는 프레임 워크가 구성 요소를 시작하는 데 사용하는 정보를 저장하는 데이터 객체 일뿐입니다. 생명주기와 같은 것은 없습니다. – Budius

+0

잘못된 용어 사용과 의도적 인 라이프 사이클의 부재에 대해 알려 주신 Mr @Budius에게 감사드립니다. 나는 그 질문을 바로 잡았다. 이제 이해할 수 있습니까? –

답변

1

하지 u는 무엇을 요구에 있는지,하지만 난 u는 원하는 것을, 다른 방법으로 설명해주십시오하지 않을 경우, 답변을하려고합니다.

Intent은 일반적으로 즉시 시작됩니다. 당신은 텐트 예를 들어, 그래서 startService 또는 startActivity를 호출하여 시작할 수 있습니다 만들 : 두 배에

context.startService(new Intent(context, ToggleService.class)); 

당신은 위의 코드를 작성, 서비스 ToggleService은 immediatly 시작됩니다. 반면에

PendingIntent

가, 나중에 시작하는 저장 위의 줄에
updateViews.setOnClickPendingIntent(R.id.phoneState, pi); 

예를

에 대한 있도록되어는 AppWidget 방송이 시작될 때 홈 화면 AppWidget에서 R.id.phoneState에 사용자가 클릭. 같은 ID로 다른 PendingIntent을 만들 경우

PendingIntent 특정 ID로 시스템에 저장되어있다가,이 ID는 requestCode 매개 변수입니다 (당신은 당신의 코드에 zero를 사용) ... 그 수단은이 무시됩니다 즉, 사용자가 R.id.phoneState