Android:如何从Activity到Service获取额外的活动

时间:2013-01-06 06:34:51

标签: android android-intent service android-activity extras

我试图通过意图向服务发送额外内容,然后打开一个应该接收意图附加内容的活动。当我查找时,附加内容在第二个活动中显示为空,

这里是代码的片段。

ToDoActivity.java片段(ACTIVITY)

public void sendNotification(String title, String body){
        Calendar c= Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
        c.set(mYear, mMonth, mDay, mhour, mminute, 0);


        Intent intent = new Intent(this, MyAlarmService.class);
        intent.putExtra(TO_DO_ITEM, body);
        intent.putExtra(TO_DO_NAME, title);
        intent.putExtra(TO_DO_TIME, c.getTimeInMillis());
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

        PendingIntent mAlarmSender = PendingIntent.getService(ToDoActivity.this,  0, intent, 0);

        AlarmManager alm = (AlarmManager)getSystemService(ALARM_SERVICE);

        alm.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), mAlarmSender);
        Toast.makeText(this, "Alarm has been set for: " + body, Toast.LENGTH_LONG).show();

    }

MyAlarmService.java(SERVICE)

@Override
    public int onStartCommand(Intent intent, int flags, int startId){
        super.onStartCommand(intent, flags, startId);

        Intent alert = new Intent();
        try{
            alert.putExtras(intent);
        }catch(NullPointerException npe){

        }

        alert.setClass(this, Alert.class);
        alert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(alert);

        return START_REDELIVER_INTENT;
    }

Alert.java Snippets(ACTIVITY)

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);


    Builder alert = new AlertDialog.Builder(this);

    Intent i = new Intent();

    Bundle b = savedInstanceState;
    String title="";
    String itemToDo="";
    long time =0;
    try{
        title = b.getString(ToDoActivity.TO_DO_NAME);
        itemToDo = b.getString(ToDoActivity.TO_DO_ITEM);
        time = b.getLong(ToDoActivity.TO_DO_TIME);
    }catch (NullPointerException npe){
        try{
            title = i.getStringExtra(ToDoActivity.TO_DO_NAME);
            itemToDo = i.getStringExtra(ToDoActivity.TO_DO_ITEM);
            time = i.getLongExtra(ToDoActivity.TO_DO_TIME, System.currentTimeMillis());

        }catch(NullPointerException npe2){

        }
    }
    if((!title.equals("") && !itemToDo.equals("") && time !=0))
        makeNotif(title, itemToDo, time);
    alert.setTitle("Alert: Do the item on your to do list!!");
    if(!itemToDo.equals(""))
        alert.setMessage(itemToDo);
    else
        alert.setMessage("There is an item on your To Do List that needs to get done, please check the list and the time");
    alert.setPositiveButton("OK", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
            mp.stop();
            finish();

        }
    });


    playSound(this, getAlarmUri());
    alert.setIcon(R.drawable.ic_launcher);

    AlertDialog ad = alert.create();
    ad.show();

}

此方法处于警报状态以创建通知(与附加内容有关的另一个问题)信息也未在此处显示(因为我将信息从上一个方法传递到此处)

static final int uniqueid= 139686;
    public void makeNotif(String title, String body, long timeInMil){
        try{
            NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            Intent intent = new Intent(this, ToDoActivity.class);

            final String itemToDo=intent.getStringExtra("TDL");
            //          final String title = b.getString("Name");
            final String titleA = intent.getStringExtra("Name");
            //          final long time = b.getLong("Time");
            final long time =intent.getLongExtra("Time",0);

            PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
            //Notification n = new Notification(0, body, System.currentTimeMillis());

            //Notifaction n = Notification

            Notification n = new Notification.Builder(this)
            .setContentTitle(title)
            .setContentText(body)
            //.setContentTitle(titleA)
            //.setContentText(itemToDo)
            .setSmallIcon(R.drawable.ic_launcher)
            .setWhen(timeInMil)
            .build();


            //n.setLatestEventInfo(this, title, body, pi);
            n.defaults=Notification.DEFAULT_ALL;
            n.flags = Notification.FLAG_AUTO_CANCEL;
            nm.notify(uniqueid, n);

        }catch(Exception e){
            e.printStackTrace();
        }

    }

如果有人可以告诉我为什么我的演员没有被转移,那就太棒了。

谢谢, Vnge

1 个答案:

答案 0 :(得分:4)

将MyAlarmService onStartCommand方法更改为将收到的意图值发送到Alert Activity:

@Override
    public int onStartCommand(Intent intent, int flags, int startId){
        super.onStartCommand(intent, flags, startId);

        Intent alert = new Intent();
        try{
            alert.putExtra(TO_DO_ITEM, intent.getExtras().getString(TO_DO_ITEM));
            alert.putExtra(TO_DO_NAME, intent.getExtras().getString(TO_DO_NAME));
            alert.putExtra(TO_DO_TIME, intent.getExtras().getLong(TO_DO_TIME));
        }catch(NullPointerException npe){

        }

并使用getIntent().getExtras()在“活动”中接收意图,而不是在“警报”活动中接收savedInstanceState

Bundle b = getIntent().getExtras();

 if(b !=null){
 title = b.getString(TO_DO_ITEM);
 itemToDo = b.getString(TO_DO_NAME);
 time = b.getLong(TO_DO_TIME);

}