gpt4 book ai didi

android - 如何从 HomeScreen Widget 调用 Activity 中的函数

转载 作者:行者123 更新时间:2023-11-29 01:16:13 25 4
gpt4 key购买 nike

从位于主屏幕上的小部件调用应用程序的 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() 的重载版本中运行。但是,从小部件发送的 Intent 也会导致调用 onCreate(),我不希望发生这种情况,因为它会重新启动线程和我拥有的各种其他初始化代码也可以重新运行。我尝试将 launchMode 设置为 singleTask,但它仍然会调用 onCreate() 而不仅仅是 onNewIntent()。回顾一下,我希望能够按下主屏幕小部件,然后启动或停止线程,或者更一般地调用现有“MainActivity”中的特定函数。

最佳答案

我不是 Widget-building-process 方面的专家,但我认为您需要更改:

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

收件人:

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

由于您需要提供一些与应用程序的交互,因此您不需要将小部件附加到特定 Activity 。相反,您需要使用 so to say 消息传递机制。在 Android 中它是 BroadcastReciever。例如,您使用它与您的“启动”服务进行交互。你可以阅读here about simple example .

此外,根据 this回答我们来到解决方案,你需要在 list 中注册接收者:

然后在 onRecieve 方法中你可以解析你的 Intent 并做任何你想做的事。在你的情况下,我建议将后台工作从 Activity 传输到 Service,因为 Activity 可以关闭(好的,Service 也是,但是它可以在没有屏幕的情况下恢复和运行)。在 MyWidgetReciever.onReceive 中,您需要通过传递“停止” Intent 来启动服务。

我不确定,但是,您可能可以直接在服务中捕获广播,而不是在外部接收器中,但可能会出现服务被终止的情况,因此它不会处理您的广播。

关于android - 如何从 HomeScreen Widget 调用 Activity 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com