Widget 由系統進程(Launcher)管理,點擊時**無法直接呼叫**主 Activity 的實例方法(Activity 可能未啟動、或在背景、或已銷毀)。
public class WidgetActionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("ACTION_SHOW_TOAST".equals(intent.getAction())) {
Toast.makeText(context, "Only Showing Toast", Toast.LENGTH_SHORT).show();
// 若需啟動 Activity:
// Intent i = new Intent(context, MainActivity.class);
// i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(i);
}
}
}
<receiver android:name=".WidgetActionReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.ACTION_SHOW_TOAST" />
</intent-filter>
</receiver>
public class HelloWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int id : appWidgetIds) {
Intent intent = new Intent("com.example.ACTION_SHOW_TOAST");
PendingIntent pending = PendingIntent.getBroadcast(
context, 0, intent, PendingIntent.FLAG_IMMUTABLE); // Android 12+ 需 FLAG_IMMUTABLE
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.widget_button, pending);
appWidgetManager.updateAppWidget(id, views);
}
}
}
PendingIntent.getBroadcast 而非 getActivity,避免啟動新 Activity 實例。FLAG_IMMUTABLE (API 31+) 確保安全性;若需攜帶資料用 FLAG_MUTABLE 並謹慎驗證。