2016-05-05 8 views
0

Mein Programm ist über die Berechnung Kalorien einiger Lebensmittel. Dies ist eine Übung für den CS-Kurs. Ich bin Anfänger auf Android OS und ich weiß nicht, warum mein Empfangsprozess nicht abgeschlossen oder auf Aktivität angezeigt werden kann.Broadcast empfängt nicht zwischen zwei benutzerdefinierten Anwendungen

Ich schreibe einfach die entsprechenden Codestücke hier. Ich hatte einige Elemente in SQLite-Datenbank und ich kann meine Elemente in der Datenbank mit Log.d-Methode überprüfen und sie sind in Ordnung.

App1:

Manifest:

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

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

}} 

Broadcast-Empfänger:

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(); 
}} 

Manifest:

<?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> 

Antwort

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

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

Sie sollten wieder über BroadcastReceivers lesen.

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

Dies schafft eine neue Instanz des Empfängers und weist die receivedItem zu cursor. Aber receivedItem ist null und da Sie nie br für Broadcasts registrieren, wird es nie nicht null sein. Auch bin ich mir nicht sicher, ob Item in Cursor umgewandelt werden könnte.

Wenn Sie den Code, den Sie hier gepostet haben, und den von Ihnen verwendeten Titel verwenden, ist die Verwendung von BroadcastReceiver möglicherweise keine gute Idee. Sie sollten versuchen, Daten per Absicht an Received weiterzuleiten oder die Daten direkt aus dem persistenten Speicher zu laden.

Und zuletzt macht Ihre thread keinen Sinn.

+0

Ich möchte nur einen zufälligen Artikel zu anderen app in jeder 60 Sekunden senden – user139518

+0

Dann ist das Problem mit der Umwandlung in 'Cursor' noch gültig. Sie müssen Ihre 'Aktivität' aus dem' BroadcastReceiver' über die Änderungen benachrichtigen. Kein globaler Status wird gespeichert. – tynn