Quelle est la méthode appropriée pour appeler une fonction dans la fenêtre Activity
de mon application à partir d'un widget situé sur l'écran d'accueil? Pour mon exemple, j'ai un thread d'arrière-plan qui est initialisé dans ma classe Activity, et j'aimerais pouvoir appuyer sur le widget depuis l'écran d'accueil pour appeler des fonctions spécifiques pour démarrer/arrêter le thread sans avoir à entrer dans l'application.Comment appeler la fonction dans Activity à partir du widget HomeScreen
Ci-dessous une dépouillé et la version barebone de l'activité, je travaille avec:
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
}
}
est Ci-dessous le code barebone pour le widget écran d'accueil:
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);
}
Voici ce que mon actuel meilleur solution est: De la recherche que j'ai faite jusqu'à présent, il semble que je dois continuer à utiliser putExtra()
puis getExtra()
avec l'intention qui est envoyé à partir du widget, et ajouter une chaîne pour dire s'il faut appeler startThread()
ou stopThread()
en fonction de l'état du thread. L'objectif actuel est de l'utiliser comme ceci:
String intentGoal = getIntent().getExtras().getString("Goal");
if(intentGoal.compareTo("Stop")==0){
stopThread();
}else if(intentGoal.compareTo("Start")==0){
startThread();
}
Et ce serait RAN le plus probable dans une version surchargée de onNewIntent()
. Cependant, l'intention envoyée par le widget entraîne également un appel à onCreate()
, ce que je ne veux pas que cela se produise car cela relancerait le thread et d'autres codes d'initialisation que je vais avoir seront également réexécutés. J'ai essayé de placer le launchMode à singleTask, mais il appellerait toujours onCreate()
plutôt que seulement onNewIntent()
. Pour récapituler, j'aimerais pouvoir appuyer sur le widget de l'écran d'accueil, et commencer ou arrêter le thread, ou plus généralement appeler une fonction spécifique dans un MainActivity existant.