小部件点击调用一个死的方法 Activity

Widget click calls a method on a dead Activity

我有一个小部件,当我单击它时,我想创建一条 SMS 并打开默认文本消息应用程序。我有第二部分(短信创建 -> 意图,开始activity 打开默认短信应用程序),但我无法弄清楚第一部分。

onUpdate @widgetProvider class

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    for (int appWidgetId : appWidgetIds) {
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
        views.setOnClickPendingIntent(R.id.docButton, getPendingSelfIntent(context, SMS1));
        views.setOnClickPendingIntent(R.id.shopButton, getPendingSelfIntent(context, SMS2));
        views.setOnClickPendingIntent(R.id.bankButton, getPendingSelfIntent(context, SMS3));
        views.setOnClickPendingIntent(R.id.helpButton, getPendingSelfIntent(context, SMS4));
        views.setOnClickPendingIntent(R.id.familyButton, getPendingSelfIntent(context, SMS5));
        views.setOnClickPendingIntent(R.id.runButton, getPendingSelfIntent(context, SMS6));
        ComponentName watchWidget = new ComponentName(context, smsWidget.class);
        appWidgetManager.updateAppWidget(watchWidget, views);
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    SmsHelper smsHelper = SmsHelper.getInstance();
    Log.d("widget", "on receive 1");
    User user= PreferencesManager.getObject("user", User.class);
    super.onReceive(context, intent);

    if(SMS1.equals(intent.getAction())){
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        RemoteViews remoteViews;
        ComponentName watchWidget;
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
        watchWidget = new ComponentName(context, smsWidget.class);
        appWidgetManager.updateAppWidget(watchWidget, remoteViews);
        smsHelper.sendSms(PHONE_NUMBER, "1 " + user.getFullName() + " " + user.getAddress());

    }

这发生在应用程序小部件提供程序中,但为了启动默认的短信应用程序,我需要从目前已死的 activity 启动它。 `public class SmsHelper {

private static SmsHelper INSTANCE;

private SmsHelper(){

}

public static SmsHelper getInstance(){
    synchronized (SmsHelper.class){
        if (INSTANCE == null){
            INSTANCE = new SmsHelper();
        }
    }
    return INSTANCE;
}

public void sendSms(String phoneNumber, String message) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
    intent.putExtra("sms_body", message);
    startActivity(intent);
}}`

最后一行 ofc 不起作用,因为我在 ActivityThreadApplicationThread 得到一个 NPE

为了调用 startActivity(),您需要一个 Context。您应该将 Context 传递给 sendSms() 方法。像这样:

@Override
public void onReceive(Context context, Intent intent) {
    SmsHelper smsHelper = SmsHelper.getInstance();
    Log.d("widget", "on receive 1");
    User user= PreferencesManager.getObject("user", User.class);
    super.onReceive(context, intent);

    if(SMS1.equals(intent.getAction())){
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        RemoteViews remoteViews;
        ComponentName watchWidget;
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.sms_widget);
        watchWidget = new ComponentName(context, smsWidget.class);
        appWidgetManager.updateAppWidget(watchWidget, remoteViews);
        smsHelper.sendSms(PHONE_NUMBER, "1 " + user.getFullName() + " " + user.getAddress(), context);

    }

并在 SmsHelper 中:

public void sendSms(String phoneNumber, String message, Context context) {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
    intent.putExtra("sms_body", message);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

注意:您将需要使用 FLAG_ACTIVITY_NEW_TASK,因为您是从非 Activity 上下文启动 Activity