2011-02-01 5 views
0

Мой виджет - это только монитор батареи. Но я хочу открыть полноэкранную активность с дополнительной информацией.Как сделать мой виджет доступным?

вот AndroidBatteryWidgetProvider.java:

package cogiloo.widget; 

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.widget.RemoteViews; 

public class AndroidBatteryWidgetProvider extends AppWidgetProvider { 


    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     // TODO Auto-generated method stub 
     updateWidget(context); 
     context.startService(new Intent(context, MyBatteryReceiver.class));  

    } 

    public void updateWidget(Context context){ 
     RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.androidbatterywidget_layout); 
     updateViews.setTextViewText(R.id.level, "waiting!"); 

     ComponentName myComponentName = new ComponentName(context, AndroidBatteryWidgetProvider.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(myComponentName, updateViews); 
    } 

} 

//////////////////////////////////////////////////////////////////////////// 

Здесь Battery.java (Деятельность я хочу открыть, нажав на мой виджет):

package cogiloo.widget; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.BatteryManager; 
import android.os.Bundle; 
import android.widget.TextView; 

public class Battery extends Activity { 

    private TextView batteryLevel, batteryVoltage, batteryTemperature, 
       batteryTechnology, batteryStatus, batteryHealth; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     batteryLevel = (TextView)findViewById(R.id.batterylevel); 
     batteryVoltage = (TextView)findViewById(R.id.batteryvoltage); 
     batteryTemperature = (TextView)findViewById(R.id.batterytemperature); 
     batteryTechnology = (TextView)findViewById(R.id.batterytechology); 
     batteryStatus = (TextView)findViewById(R.id.batterystatus); 
     batteryHealth = (TextView)findViewById(R.id.batteryhealth); 

     this.registerReceiver(this.myBatteryReceiver, 
       new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    } 

    private BroadcastReceiver myBatteryReceiver 
    = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      // TODO Auto-generated method stub 

      if (arg1.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){ 
       batteryLevel.setText("Level: " 
         + String.valueOf(arg1.getIntExtra("level", 0)) + "%"); 
       batteryVoltage.setText("Voltage: " 
         + String.valueOf((float)arg1.getIntExtra("voltage", 0)/1000) + "V"); 
       batteryTemperature.setText("Temperature: " 
         + String.valueOf((float)arg1.getIntExtra("temperature", 0)/10) + "c"); 
       batteryTechnology.setText("Technology: " + arg1.getStringExtra("technology")); 

       int status = arg1.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN); 
       String strStatus; 
       if (status == BatteryManager.BATTERY_STATUS_CHARGING){ 
        strStatus = "Charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING){ 
        strStatus = "Dis-charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING){ 
        strStatus = "Not charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_FULL){ 
        strStatus = "Full"; 
       } else { 
        strStatus = "Unknown"; 
       } 
       batteryStatus.setText("Status: " + strStatus); 

       int health = arg1.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN); 
       String strHealth; 
       if (health == BatteryManager.BATTERY_HEALTH_GOOD){ 
        strHealth = "Good"; 
       } else if (health == BatteryManager.BATTERY_HEALTH_OVERHEAT){ 
        strHealth = "Over Heat"; 
       } else if (health == BatteryManager.BATTERY_HEALTH_DEAD){ 
        strHealth = "Dead"; 
       } else if (health == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE){ 
        strHealth = "Over Voltage"; 
       } else if (health == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE){ 
        strHealth = "Unspecified Failure"; 
       } else{ 
        strHealth = "Unknown"; 
       } 
       batteryHealth.setText("Health: " + strHealth); 

      } 
     } 

    }; 
} 


///////////////////////////////////////////////////////////// 

Вот мой BatteryReceiver:

package cogiloo.widget; 

import android.app.Service; 
import android.appwidget.AppWidgetManager; 
import android.content.BroadcastReceiver; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.BatteryManager; 
import android.os.IBinder; 
import android.widget.RemoteViews; 

public class MyBatteryReceiver extends Service { 

    private int batterylevel = 0; 
    private String batteryStatus =""; 

    private BroadcastReceiver myReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_BATTERY_CHANGED)) 
      { 
       batterylevel = intent.getIntExtra("level", 0); 

       int status = intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN); 
       String strStatus; 
       if (status == BatteryManager.BATTERY_STATUS_CHARGING){ 
        batteryStatus = "Charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_DISCHARGING){ 
        batteryStatus = "Dis-charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_NOT_CHARGING){ 
        batteryStatus = "Not charging"; 
       } else if (status == BatteryManager.BATTERY_STATUS_FULL){ 
        batteryStatus = "Full"; 
       } else { 
        batteryStatus = ""; 
       } 

       updateAppWidget(context); 
      } 
     } 

     public void updateAppWidget(Context context){ 
      RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.androidbatterywidget_layout); 
      updateViews.setTextViewText(R.id.level, 
        "Cogiloo Battery\n\n" + 
        "Bat. Status:\n" + 
        "Level: " + batterylevel + "%\n" + 
        "Status: " + batteryStatus); 

      ComponentName myComponentName = new ComponentName(context, AndroidBatteryWidgetProvider.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(context); 
      manager.updateAppWidget(myComponentName, updateViews); 
     } 
    }; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 

     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 
     registerReceiver(myReceiver, intentFilter); 



    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     unregisterReceiver(myReceiver); 
    } 



    //borrar esto y el activity Battery y en el maniffest 


    public void onClick() { 
     // TODO Auto-generated method stub 
     Intent i = new Intent(this, Battery.class); 
     startActivity(i); 
    } 

//hasta aqui 



} 

///////////////////////////////////////////////////////// 

Виджет работает хорошо, но я не мог найти способ сделать его интерактивным!

ответ

2

нормально Перед

manager.updateAppWidget(myComponentName, updateViews); 

вы должны определить намерение, который срабатывает при нажатии кнопки, например, в Imagen в виджете (R.id.imagetoClick)

Intent defineIntent = new Intent(); 
    defineIntent.setClassName("cogiloo.widget","cogiloo.widget.ActivitytoShow"); 
PendingIntent pendingIntent = PendingIntent.getActivity(context, 
0 /* no requestCode */, defineIntent, 0 /* no flags */); 
    updateViews.setOnClickPendingIntent(R.id.imagetoClick, pendingIntent); 
1

Чтобы сделать виджет clickable вам нужно позвонить setOnClickPendingIntent в Remote View виджета, передав идентификатор ресурса View, который вы хотите сделать кликабельным, и Ожидание намерения, которое вы хотите запустить.

В вашем примере это будет выглядеть примерно так:

Intent intent = new Intent(context, Battery.class); 
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

updateViews.setOnClickPendingIntent(R.id.level, pi); 
4

Изменить updateWidget() создать и назначить новое PendingIntent.

public void updateWidget(Context context){ 
    RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.androidbatterywidget_layout); 
    Intent intent = new Intent(context, Battery.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 
    updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent); 
    ... 
} 
+0

Спасибо! решена !! –

Смежные вопросы