2

我正在Android Studio中編寫我的代碼,但我正在編寫的項目沒有GUI,並且從不更新用戶的視圖。它只是用廣播接收器監聽上次安裝的應用程序,並將信息發送到另一個java文件。將數據從BroadcastReceiver發送到活動,而應用程序在後臺

我在想如何從廣播接收器發送一個字符串到一個活動(也許這不應該是一個「活動」,而是一個「服務」?),並在應用程序在後臺時有這項工作。

現在我有一個廣播接收機正在監聽手機上的最後一個安裝的應用程序(這在後臺運行)。當廣播接收機獲得已安裝的應用程序時,我有一個自定義廣播接收機用於通知我的主要活動。但是這個自定義接收器不能在後臺工作。同樣,也許我不應該使用Activity來從BroadcastReceiver接收信息?

有沒有一種方法可以將我的廣播接收器的信息發送到我的主要活動,而應用程序在後臺?我還需要我的主要活動來在後臺恢復正常功能(在後臺進行GUI更新時)。

廣播接收器它通過一個新的意圖

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")); 

我接收數據from 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的接收器,但顯然,這並不讓我從廣播接收器接收信息一旦應用進入後臺

@Override 
public void onStop() 
{ 

    try{ 

     unregisterReceiver(broadcastReceiver); 
    } 

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

    super.onStop(); 
} 

回答

2

老實說,我不認爲更新在後臺進行的活動是一種很好的做法(即使可能)。

根據DOCS

活動是單一的,集中的一點是,用戶可以做。幾乎所有活動都與用戶交互,所以Activity類負責爲您創建一個窗口,您可以在其中使用setContentView(View)放置UI。雖然活動通常以全屏窗口的形式呈現給用戶,但它們也可以以其他方式使用:作爲浮動窗口......或嵌入到其他活動(使用ActivityGroup)內。

所以,如果活動在後臺,它是不可見的。所以,更新其內容是沒有用的(因爲它對用戶不可見)。

事實上,你應該實現以下行爲,而不是:

  • 使用您的服務僅保存的信息(在數據庫/內容提供商),並通知新的信息,請訪問活動。那麼,如果你的活動是開放的,它會立即消耗這些信息。如果活動未打開,則信息會保存以供用戶需要時使用。

  • 如果應用程序僅停止,您可以在onResume()方法中更新活動內容。

  • 如果您的應用程序被殺並且用戶再次打開它,您可以在onCreate()方法中更新所有視圖。在向用戶顯示視圖之前調用onCreate()。當用戶婉的檢查信息

這樣,信息將在必要時更新。否則,這是浪費時間。

+0

謝謝你的回答。我完全同意你的看法。但是爲了增加我的問題,我想我的「應用程序」永遠不需要用戶查看的GUI。從這個意義上說,它不是一個真正的應用程序,而只是一個正在運行的程序,我正好在Android Studio中編寫程序。如果是這種情況,那麼我的「MainActivity」應該轉換爲服務?這是最好的解決方案,還是有另一種方式,如果我只是需要我的應用程序在任何時候都在運行偵聽已安裝的應用程序,並且沒有任何更新在任何視圖中。 – Natalie

+0

Hummm ..因爲你沒有GUI,你不需要一個活動......也許,你只需要廣播接收器。接收器收到該動作並完成您需要的所有任務....如果您可以在接收器中執行所有任務,那麼您不需要該服務...... – W0rmH0le

+0

我會隨時隨地處理這個問題。謝謝 – Natalie

相關問題