2016-05-05 62 views
0

我的程序是關於計算一些食物的卡路里。這是CS課程的練習。我是Android操作系統的初學者,我不知道爲什麼我的接收過程無法在Activity上完成或顯示。廣播沒有接收兩個自定義應用程序

我只是在這裏寫相關的代碼片段。我在sqlite數據庫上有一些項目,我可以使用Log.d方法檢查數據庫上的項目,它們都可以。

App1的:

清單:

<receiver android:name="ItemBroadcastReceiver" 
      android:exported="true"> 
    <intent-filter> 
     <action android:name="com.example.furkan.datagenerator" /> 

    </intent-filter> 
</receiver> 

Received.class

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.received); 

    ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
    Cursor cursor = (Cursor) br.receivedItem; 
    ReceivedItemsAdapter adapter = new ReceivedItemsAdapter(this, cursor); 
    ListView listView = getListView(); 
    listView.setAdapter(adapter); 
} 

適配器:

public class ReceivedItemsAdapter extends CursorAdapter { 
public ReceivedItemsAdapter(Context context, Cursor c) { 
    super(context, c); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View retView = inflater.inflate(R.layout.received, parent, false); 

    return retView; 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    //ImageView icon = (ImageView) view.findViewById(R.id.icon); 
    TextView name = (TextView) view.findViewById(R.id.name); 
    TextView cal = (TextView) view.findViewById(R.id.amountCal); 
    TextView unit = (TextView) view.findViewById(R.id.unit); 
    unit.setText(" cal"); 
    name.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)))); 
    cal.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)))); 

}} 

廣播接收機:

public class ItemBroadcastReceiver extends BroadcastReceiver { 
Item receivedItem; 
@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 

    receivedItem = new Item(bundle.getString("name"), 
           Integer.parseInt(bundle.getString("calories")), 
           bundle.getString("category"), 
           null); 
}} 

App2的:

MainActivity:

public class MainActivity extends AppCompatActivity { 
final int DELAY = 60000; 
ReceivedItem item; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ReceivedItemsDatabaseHelper dbHelper = new  ReceivedItemsDatabaseHelper(this); 


    item = new ReceivedItem(dbHelper.fetchReceivedItem().getString(
      dbHelper.fetchReceivedItem().getColumnIndex(
        dbHelper.fetchReceivedItem().getColumnName(1))), 
      Integer.parseInt(dbHelper.fetchReceivedItem().getString(
        dbHelper.fetchReceivedItem().getColumnIndex(
          dbHelper.fetchReceivedItem().getColumnName(2)))), 
      dbHelper.fetchReceivedItem().getString(
        dbHelper.fetchReceivedItem().getColumnIndex(
          dbHelper.fetchReceivedItem().getColumnName(3))), null); 

    Thread thread = new Thread() { 
     public void run() { 
      synchronized (this) { 
       try { 
        Log.d("Response ", item.getName()+", "+item.getCategory()+", "+item.getCalories()); 
        Intent intent = new Intent(); 
        intent.setAction("com.example.furkan.datagenerator"); 
        intent.putExtra("name", item.getName()); 
        intent.putExtra("calories", item.getCalories()); 
        intent.putExtra("category", item.getCategory()); 
        sendBroadcast(intent); 
        sleep(DELAY); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     } 
    }; 
    thread.start(); 
}} 

清單:

<?xml version="1.0" encoding="utf-8"?> 

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

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

回答

0
IntentFilter filter = new IntentFilter(); 
filter.addAction("com.example.furkan.datagenerator"); 

ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
registerReceiver(br, filter); 
0

您應該再次閱讀有關BroadcastReceivers

ItemBroadcastReceiver br = new ItemBroadcastReceiver(); 
Cursor cursor = (Cursor) br.receivedItem; 
ReceivedItemsAdapter adapter = new ReceivedItemsAdapter(this, cursor); 
ListView listView = getListView(); 
listView.setAdapter(adapter); 

這就造成了接收器的一個新實例,並分配到receivedItemcursor。但receivedItemnull因爲您從來沒有註冊br廣播,它永遠不會是null。另外我不確定,如果Item可以投到Cursor

考慮到您在此發佈的代碼和您使用的標題,使用BroadcastReceiver可能不是一個好主意。您應該嘗試通過意向將數據傳遞給Received,或直接從持久存儲裝載數據。

最後你的thread沒有任何意義。

+0

我只是想每60秒向其他應用程序播放一個隨機項目 – user139518

+0

然後將它轉換爲'Cursor'的問題仍然有效。你必須在BroadcastReceiver中通知你的'Activity'有關這些變化。沒有全局狀態存儲。 – tynn

相關問題