簡體   English   中英

當應用程序處於后台時,將數據從BroadcastReceiver發送到活動

[英]Send data from BroadcastReceiver to activity, while app is in background

我正在Android Studio中編寫代碼,但是正在編寫的項目沒有GUI,並且永遠不會為用戶更新視圖。 它只是使用廣播接收器監聽最后安裝的應用程序,然后將信息發送到另一個Java文件。

我想知道如何從廣播接收器向活動發送字符串(也許這不應該是“活動”而是“服務”嗎?),並且在應用程序處於后台時進行這項工作。

現在,我有一個廣播接收器,正在偵聽手機上最后安裝的應用程序(此應用程序在后台運行)。 我設置了一個自定義廣播接收器,以在廣播接收器安裝了應用程序時通知我的主要活動。 但是此自定義接收器無法在后台運行。 同樣,也許我不應該使用Activity從BroadcastReceiver接收信息?

在后台運行應用程序時,是否可以將信息從廣播接收器發送到主要活動? 我還需要我的主要活動來在后台恢復正常功能(在后台時沒有完成GUI更新)。

我的BroadcastReceiver通過新的Intent向我的主活動發送數據

public class NewInstallReceiver extends BroadcastReceiver {

ApplicationInfo ai;

@Override
public void onReceive(Context context, Intent intent) {

    final PackageManager pm = context.getPackageManager();

    try {

        // if app is added, get package info

        ai = pm.getApplicationInfo(intent.getData().getSchemeSpecificPart(), 0);

        Intent i = new Intent("broadcastName");
        // Data pass to activity
        i.putExtra("appInfo", ai);
        context.sendBroadcast(i);

    } catch (final PackageManager.NameNotFoundException e) {
        ai = null;
    }
}

}

在onCreate的MainActivity中,我注冊接收者:

registerReceiver(broadcastReceiver, new IntentFilter("broadcastName"));

我從BroadcastReceiver接收數據

BroadcastReceiver broadcastReceiver =  new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // get applicationInfo
        Bundle b = intent.getExtras();
        Object applicationInfo = b.get("appInfo");

        ApplicationInfo appInfo = (ApplicationInfo) applicationInfo;

        getNewData(appInfo);
    }
};

然后,我必須在MainActivity中注銷接收器,但是很明顯,一旦應用程序進入后台,這顯然不允許我從BroadcastReceiver接收信息。

@Override
public void onStop()
{

    try{

        unregisterReceiver(broadcastReceiver);
    }

    catch(Exception e){
        System.out.println("Exception is " + e.toString());
    }

    super.onStop();
}

老實說,我認為更新處於后台的活動不是一個好習慣(即使可能)。

根據DOCS

活動是用戶可以做的一件專注的事情。 幾乎所有活動都與用戶進行交互,因此Activity類負責為您創建一個窗口,您可以在其中放置帶有setContentView(View)的UI。 盡管活動通常以全屏窗口的形式呈現給用戶,但它們也可以以其他方式使用:作為浮動窗口...或嵌入到另一個活動中(使用ActivityGroup)。

因此,如果“活動”在后台,則它是不可見的。 因此,更新其內容是無用的(因為它對用戶不可見)。

實際上,您應該改為實現以下行為:

  • 僅將您的服務用於保存信息(在數據庫/內容提供程序中),並通知活動有新信息可用。 然后,如果您的活動處於打開狀態,它將立即使用該信息。 如果未打開“活動”,則該信息將保留,以備用戶需要時使用。

  • 如果僅停止了應用程序,則可以在onResume()方法期間更新“活動”內容。

  • 如果您的應用被殺死並被用戶再次打開,則可以在onCreate()方法期間更新所有視圖。 在向用戶顯示視圖之前,將調用onCreate()

這樣,信息將在需要進行更新: 當用戶要檢查信息時 否則,那是浪費時間。

暫無
暫無

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

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