0

My application should take pictures in background at a specific time of the day. I am going to use AlarmManager but I am wondering whether the class which implements the behavior of my application (i.e., taking a picture) should extend Service or BroadcastReceiver. What do you think?

4

1 回答 1

1

您应该将 IntentSerivce 与 AlaramManger 一起使用,并在您的活动中定义 BroadcastReceiver。

public class DownloadService extends IntentService {

private int result = Activity.RESULT_CANCELED;
 public static final String URL = "urlpath";
public static final String FILENAME = "filename";
public static final String FILEPATH = "filepath";
public static final String RESULT = "result";
public static final String NOTIFICATION = "com.vogella.android.service.receiver";

public DownloadService() {
 super("DownloadService");
}

// Will be called asynchronously be Android
@Override
protected void onHandleIntent(Intent intent) {
String urlPath = intent.getStringExtra(URL);
String fileName = intent.getStringExtra(FILENAME);
File output = new File(Environment.getExternalStorageDirectory(),
    fileName);
if (output.exists()) {
  output.delete();
}

InputStream stream = null;
FileOutputStream fos = null;
try {

URL url = new URL(urlPath);
stream = url.openConnection().getInputStream();
InputStreamReader reader = new InputStreamReader(stream);
  fos = new FileOutputStream(output.getPath());
  int next = -1;
  while ((next = reader.read()) != -1) {
    fos.write(next);
  }
  // Successful finished
  result = Activity.RESULT_OK;

} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (stream != null) {
    try {
      stream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  if (fos != null) {
    try {
      fos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
publishResults(output.getAbsolutePath(), result);
}

private void publishResults(String outputPath, int result) {
Intent intent = new Intent(NOTIFICATION);
intent.putExtra(FILEPATH, outputPath);
intent.putExtra(RESULT, result);
sendBroadcast(intent);
}
} 


public class MainActivity extends Activity {

private TextView textView;
private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
  Bundle bundle = intent.getExtras();
  if (bundle != null) {
    String string = bundle.getString(DownloadService.FILEPATH);
    int resultCode = bundle.getInt(DownloadService.RESULT);
    if (resultCode == RESULT_OK) {
      Toast.makeText(MainActivity.this,
          "Download complete. Download URI: " + string,
          Toast.LENGTH_LONG).show();
      textView.setText("Download done");
    } else {
      Toast.makeText(MainActivity.this, "Download failed",
          Toast.LENGTH_LONG).show();
      textView.setText("Download failed");
    }
  }
}

};

@Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 textView = (TextView) findViewById(R.id.status);


 }

 @Override
 protected void onResume() {
super.onResume();
 registerReceiver(receiver, new IntentFilter(DownloadService.NOTIFICATION));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}

public void onClick(View view) {

Intent intent = new Intent(this, DownloadService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);

AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//   Start every 30 seconds
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);
}
} 
于 2013-11-02T08:53:29.967 回答