小部件点击调用一个死的方法 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
。
我有一个小部件,当我单击它时,我想创建一条 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
。