views:

1328

answers:

3

Hi

I have a service that is downloading a file. When the download is done, I would like to update my "Downloaded files" list in my Activity, but only if the Activity is running. I do not want the Activity to start if it's not already running.

I was hoping I could do this by making a new Intent with some special flag.

Anyone have any idea how I can achieve this? A tiny code example maybe?

+7  A: 

You can create new BroadcastReceiver instance and do something along these lines on your Activity's onResume() method:

registerReceiver(myReceiver, new IntentFilter(DownloadService.ACTION_FILE_DOWNLOADED));

After that, override myReceiver's onReceive() method to call a function that updates the component you want:

@Override 
public void onReceive(Context context, Intent intent) {
...
    updateViewWithData(service.getNewFileData());
...
}

On your Activity's onPause() method, just unregister the receiver:

unregisterReceiver(myReceiver);

I hope that this would help you, feel free to ask if there is something unclear.

Dimitar Dimitrov
+1  A: 

The good way to do this is to bind your "Downloaded files" activity to the service. When you bind the service, in the function onServiceConnected, register a Binder callback. Then, whenever you have new data available, service just calls that callback. If the activity is not running, the callback list at the service side will be empty, so it will not inform your activity.

For an example of this approach, take a look at RemoteService.java in Android SDK:

samples\ApiDemos\src\com\example\android\apis\app\

MannyNS
A: 

Thanks, attatching the broadcastReciever at runtime seems to work, but i could not get it to work when i tried to bind it in the manifest xml.

This works : In my activity i added:

private MyReceiver reciever;

protected void onPause(){
  super.onPause();
  unregisterReceiver(reciever);
}

protected void onStart(){
  super.onStart();
  reciever = new MyReceiver(this);
  registerReceiver(reciever, new IntentFilter("Gurba"));
}

//...attatched to button...

public void onClick(View arg0) {
  Log.i("dbg", "clickkkk");

  Intent myIntent = new Intent("Gurba");
  sendBroadcast(myIntent);
}

And my MyReciever class as follow:

public class MyReceiver extends BroadcastReceiver {

    private Activity activity;

    public MyReceiver(Activity activity) {
        this.activity = activity;
        Log.i("dbg","MyReciever created");
    }

    public void onReceive(Context context, Intent intent) {
        Log.i("dbg","onRecieve() called!");
        if(this.activity == null);

    }
}

This did NOT work:

    private MyReceiver reciever;

protected void onPause(){
 super.onPause();
}

protected void onStart(){
 super.onStart();
 reciever = new MyReceiver(this);
}

and added to the AndroidManifest.xml

    <application 
         android:icon="@drawable/icon" 
         android:label="@string/app_name"
         android:theme="@android:style/Theme.NoTitleBar">

    <receiver android:name=".MyReceiver">
            <intent-filter>
               <action android:name="Gurba" />
            </intent-filter>
    </receiver> 
    <activity android:name=".Main" ... continue manifest...

when i click my button i just get a runtime-exception: unable to instantiate receiver com.example.MyReciever ....

Any ideas on this? Something missing in my XML?

PHP_Jedi