ホームスクリーンにあるウィジェットからアプリケーションのActivity
の関数を呼び出す適切な方法は何ですか?私の例では、私は自分のActivityクラスで初期化されたバックグラウンドスレッドを持っていて、アプリケーションに入ることなくスレッドを開始/停止する特定の関数を呼び出すためにホーム画面からウィジェットを押すことができます。HomeScreenウィジェットからアクティビティの関数を呼び出す方法
私が働いている活動の剥奪とベアボーンのバージョンである:
以下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()
をウィジェットから送信されたインテントと共に使用し、startThread()
または0を呼び出すかどうかを示す文字列を追加する必要があるようですは、スレッドのステータスに基づいています。現在の目標は、このようにそれを使用することです:
String intentGoal = getIntent().getExtras().getString("Goal");
if(intentGoal.compareTo("Stop")==0){
stopThread();
}else if(intentGoal.compareTo("Start")==0){
startThread();
}
そして、それは最も可能性の高いonNewIntent()
のオーバーロードされたバージョンで走ったことになります。しかし、ウィジェットから送信されたインテントはonCreate()
にもコールされます。これは、スレッドや他の初期化コードを再起動するため、再実行されるため、発生したくないものです。私はlaunchModeをsingleTaskに設定しようとしましたが、それでもonNewIntent()
ではなくonCreate()
が呼び出されます。要約すると、私はホーム画面ウィジェットを押して、スレッドを開始または停止させたり、より一般的には既存の `MainActivity '内の特定の関数を呼び出すことができます。