此应用程序窗口小部件代码段中所有意图(PendingIntents)的逻辑流程

时间:2014-09-10 09:44:44

标签: java android android-intent android-activity android-widget

我正在学习如何在Android中构建主屏幕小部件。此代码用于应用程序窗口小部件将RingerMode从NORMAL切换为SILENT,反之亦然。

这样可以正常工作,但我需要完全了解逻辑流程(即,当它发生时,去哪里,做什么,何时死亡)。

请帮助我更清楚地理解这个主题。

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 个答案:

答案 0 :(得分:1)

仍然不确定你在问什么,但我会尽力回答,如果不是你想要的,请以不同的方式解释。

Intent通常是立即开始的。您创建一个Intent可以通过调用startServicestartActivity来启动它,例如:

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

在您编写上述代码的两次中,服务ToggleService立即开始。

另一方面,

PendingIntent保存为稍后启动,例如

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

在上面的一行中,AppWidget广播是在用户点击HomeScreen AppWidget中的R.id.phoneState时启动的。

每个PendingIntent都存储在具有特定ID的系统中,此ID是requestCode参数(您在代码中使用zero)...这意味着,如果您创建一个不同的PendingIntent,使用相同的ID覆盖它,这意味着当用户点击R.id.phoneState时会启动不同的操作