1

我最近有一個問題(Sharing data between activitiesin Android),我解決了部分問題,但仍然存在問題。我決定開始全新的。動態更新Android應用程序活動之間的數據

此簡單的應用程序執行以下操作的東西:

  1. 啓動一個主活動其onCreate()方法,在此期間立即調用一個「DataActivity」
  2. DataActivity僅遞增一個號碼,創建一個包,填料的然後將它發送到意圖的LocalBroadcastManager中。
  3. MainActivity選擇備份新數字並更新其ListView。

現在,我的問題躺在這裏:

  • (固定)的意圖沒有被廣播! (它在我最後的應用程序,但它完全不工作在這裏)
  • 我不知道如何確保MainActivity的列表是在顯示器的頂部
  • 我不知道如何「最小化」 DataActivity

這裏是我的MainActivity.java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Intent intent = new Intent(this, DataActivity.class); 
     intent.putExtra("First", true); 
     startActivity(intent); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     IntentFilter iff = new IntentFilter(MainActivity.class.getCanonicalName()); 
     Log.d(getClass().getSimpleName(), "Creating Intent for Position Debuging..."); 
     LocalBroadcastManager.getInstance(this).registerReceiver(AGDReceiver, iff); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(AGDReceiver); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private volatile ArrayAdapter<Integer> aradInt; 
    public BroadcastReceiver AGDReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final int broadcast = intent.getExtras().getInt("iInt"); 
      Bundle b = intent.getExtras().getBundle("bBundle"); 
      final int bI = b.getInt("bInt"); 
      Log.d(getClass().getSimpleName(), "onReceieve(): " + broadcast); 
      initArrAd(); 
      runOnUiThread(new Runnable() { 
       public void run() { 
        Log.d(getClass().getSimpleName(), "runOnUiThread(): " + broadcast); 
        aradInt.add(broadcast); 
        aradInt.setNotifyOnChange(true); 
        aradInt.notifyDataSetChanged(); 
       } 
      }); 

     } 

    }; 

    private void initArrAd() { 
     if (aradInt == null) { 
      aradInt = new ArrayAdapter<Integer>(this.getApplicationContext(),R.id.listView1); 
     } 
    } 

} 

DataActivity.java

public class DataActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_data); 
    } 

    private volatile int count = 0; 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d(getClass().getSimpleName(), "onResume(): " + count); 
     count++; 
     Intent intent = new Intent(MainActivity.class.getCanonicalName()); 
     Bundle b = new Bundle(); 
     b.putInt("bInt", count); 
     intent.putExtra("iInt", count); 
     intent.putExtra("bBundle", b); 
     this.moveTaskToBack(true); 
     for (int i = 1; i < 100; i++) { 
      LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent); 
      intent.removeExtra("iInt"); 
      intent.removeExtra("bInt"); 
      intent.putExtra("bInt", count++); 
      intent.putExtra("iInt", count); 
     } 
     Log.d(getClass().getSimpleName(), "onResume(): Done"); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.data, menu); 
     return true; 
    } 

} 

至於更新ListView,我想一旦我始終如一地獲取數據,並且MainActivity的視圖是可見的,那應該是微不足道的。

以防萬一,我的清單。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.eks.mytestbed" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.eks.mytestbed.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.eks.mytestbed.DataActivity" 
      android:label="@string/title_activity_data" > 
     </activity> 
    </application> 

</manifest> 

更新:它看起來像問題的廣播方面下(我需要把註銷電話中.onDestroy()方法,而不是.onPause()),但在MainActivity更新列表視圖不管用!

回答

1

問題是你還沒有註冊你的BroadcastReceiver。您必須註冊一個接收器才能使用它,因此您必須在完成時取消註冊。

正如你已經使用LocalBroadcastReceiver所以

要註冊

LocalBroadcastManager.getInstance(this).registerReceiver(
      AGDReceiver , 
      new IntentFilter(INTENT_FILTER_NAME)); 

註銷

LocalBroadcastManager.getInstance(this).unregisterReceiver(
      AGDReceiver); 

還有一件事是你aradLong未初始化

+0

另一個技巧,更好地遵循命名約定。用小寫字母開始一個實例的名字 – stinepike 2013-04-22 02:50:28

+0

嗯,我實現了,它仍然無法正常工作。 BroadcastReceiver沒有被調用。 – 2013-04-23 01:11:55

+0

我確實承認,我忘了把註冊放在那裏,但仍然......不行。 – 2013-04-23 01:29:05

相關問題