【发布时间】:2017-01-20 16:55:59
【问题描述】:
从位于主屏幕上的小部件调用我的应用程序Activity 中的函数的正确方法是什么?对于我的示例,我有一个在我的 Activity 类中初始化的后台线程,并且希望能够从主屏幕按下小部件以调用特定函数来启动/停止线程,而无需进入应用程序。
以下是我正在使用的 Activity 的精简和准系统版本:
public class MainActivity extends AppCompatActivity {
private Thread thread;
private Runnable runner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startThread();
}
private void startThread() {
//start/restart the thread
}
public void stopThread() {
//interupt the thread
}
}
以下是主屏幕小部件的准系统代码:
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
Intent intent = new Intent(context, MainActivity.class);
intent.putExtra("Goal","Stop");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.speed_widget);
views.setOnClickPendingIntent(R.id.widgetButton, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
这是我目前最好的解决方案:从我目前所做的研究来看,我似乎需要继续使用putExtra(),然后将getExtra() 与从小部件发送的 Intent 一起使用,并且添加一个字符串来说明是否根据线程的状态调用startThread() 或stopThread()。目前的目标是这样使用它:
String intentGoal = getIntent().getExtras().getString("Goal");
if(intentGoal.compareTo("Stop")==0){
stopThread();
}else if(intentGoal.compareTo("Start")==0){
startThread();
}
它很可能在onNewIntent() 的重载版本中运行。但是,从小部件发送的意图也会导致对onCreate() 的调用,我不希望发生这种情况,因为它会重新启动线程,并且我拥有的各种其他初始化代码也将被重新运行。我尝试将launchMode 设置为singleTask,但它仍然会调用onCreate() 而不仅仅是onNewIntent()。回顾一下,我希望能够按下主屏幕小部件,然后启动或停止线程,或者更一般地调用现有“MainActivity”中的特定函数。
【问题讨论】:
标签: android multithreading android-intent widget android-widget