首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Widget 點擊觸發主 Activity 方法:使用 BroadcastReceiver 中轉

     編輯:程式設計綜合問答

架構限制

Widget 由系統進程(Launcher)管理,點擊時**無法直接呼叫**主 Activity 的實例方法(Activity 可能未啟動、或在背景、或已銷毀)。

正確模式:Widget → PendingIntent(Broadcast) → BroadcastReceiver → 呼叫邏輯

1. 定義 BroadcastReceiver(可在獨立類或 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);
        }
    }
}

2. Manifest 註冊

<receiver android:name=".WidgetActionReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.example.ACTION_SHOW_TOAST" />
    </intent-filter>
</receiver>

3. Widget Provider 建立 PendingIntent

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 並謹慎驗證。
  • Receiver 中可安全呼叫 Context 相關 API(Toast、啟動 Service、發送通知),**不可直接操作 Activity UI**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved