簡體   English   中英

Android Widget-如何檢查父應用程序是否正在運行

[英]Android Widget - How to check if parent app is running

用Android說話。 我有一個應用程序和一個小部件。 該小部件應該每隔n秒自動更新一次,並且在父應用程序被殺死之前可以正常工作。 一旦應用被殺死,它就不再更新。 我的基於計時器的更新和onClickPendingIntent更新都發生這種情況。

有什么方法可以檢查父應用程序是否在窗口小部件中運行以及是否沒有運行以啟動它? (最好不使用getRunningTasks(或任何其他額外的權限),但如果可以的話)

這是我的小部件代碼的重要部分,要進行調試,它將顯示兩個數字,一個數字是根據計時器更新的,另一個數字是在按鍵時更新的。 該小部件是根據計時器繪制的。

    private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick";
public static int counter = 0; // time based update
public static int counter2 = 0; // onClick update


public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Timer timer = new Timer();
    // 2 seconds for debug   
    timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 2000);

    RemoteViews remoteViews;
    ComponentName watchWidget;
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_main);
    watchWidget = new ComponentName(context, HelloWidget.class);

    remoteViews.setOnClickPendingIntent(R.id.widget_textview, getPendingSelfIntent(context, SYNC_CLICKED));
    appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}

protected PendingIntent getPendingSelfIntent(Context context, String action) {
    Intent intent = new Intent(context, getClass());
    intent.setAction(action);
    return PendingIntent.getBroadcast(context, 0, intent, 0);
}

public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);

    if (SYNC_CLICKED.equals(intent.getAction())) {
        counter2++;

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        RemoteViews remoteViews;
        ComponentName watchWidget;

        remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_main);
        watchWidget = new ComponentName(context, WidgetUpdater.class);

        remoteViews.setTextViewText(R.id.widget_textview, "Updating...");

    // unrelated async task here

        appWidgetManager.updateAppWidget(watchWidget, remoteViews);

    }
}

private class MyTime extends TimerTask {
    RemoteViews widgetView;
    AppWidgetManager appWidgetManager;
    SharedPreferences settings;
    ComponentName thisWidget;


    public MyTime(Context context, AppWidgetManager appWidgetManager) {
        this.appWidgetManager = appWidgetManager;
        settings = context.getSharedPreferences("prefs", 0);
        widgetView = new RemoteViews(context.getPackageName(), R.layout.widget_main);
        thisWidget = new ComponentName(context, HelloWidget.class);
    }

    @Override
    public void run() {
        counter++;
        String hashrate = settings.getString("hashrate", null);
        String rejected = settings.getString("rejected", null);
        widgetView.setTextViewText(R.id.widget_textview, counter + "-" + counter2);
        appWidgetManager.updateAppWidget(thisWidget, widgetView);
    }
} 

再一次,當父應用被殺死時,我的小部件停止更新。 如果當前沒有運行,我可以使用小部件中的onClick方法啟動父應用程序嗎?

問題是您的AppWidgetProvider最終將被系統破壞。 根據文檔,它實際上只是一個BroadcastReceiver ,其生命周期僅限於onReceive()的持續時間:

BroadcastReceiver對象僅在對onReceive(Context,Intent)的調用期間有效。 一旦您的代碼從該函數返回,系統將認為該對象已完成並且不再處於活動狀態。

正如您已經體驗到的那樣,讓BroadcastReceiver保留TimerTask實現將失敗。 最好的方法是使用AlarmManager在下一個計划的時間間隔發送PendingIntent 這個PendingIntent可以啟動BroadcastReceiverService (也許是IntentService ),后者將執行更新並安排下一個警報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM