标签: android-pendingintent

未触发Android通知操作(PendingIntent)

我想在我的应用程序中添加一个Notification操作项,这是一个音乐播放器.启动流时,应触发通知,并在通知中显示流的停止按钮.到目前为止通知工作正常,我遇到了停止操作项目的问题.以下是在启动流的服务中声明它的方式:

Intent stopIntent = new Intent(this, MusicPlayerNew.class);
stopIntent.putExtra("STOP", "STOP");
PendingIntent stopPendingIntent = PendingIntent.getActivity(this, 0,
                stopIntent, PendingIntent.FLAG_UPDATE_CURRENT, null);
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent);
Run Code Online (Sandbox Code Playgroud)

现在在onResume() - 我的活动方法中,我用getIntent().getStringExtra()检查"STOP"额外,但我通过getIntent()检索的意图没有设置额外的东西:(

我还试图检查发送广播(我有一个广播接收器工作从服务到活动进行通信)

Intent stopIntent2 = new Intent(MusicPlayerNew.STOP_MEDIAPLAYER);
PendingIntent stopPendingIntent2 = PendingIntent.getBroadcast(this, 0,
                stopIntent2, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.ic_stat_stop, "Stop", stopPendingIntent2); 
Run Code Online (Sandbox Code Playgroud)

现在,如果活动当前位于前台,则此功能正常.如果活动在后台,则停止按钮不执行任何操作:(

编辑: 我在我的Activity中将BroadcastReceiver作为私有类

private class DataUpdateReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
..
}}
Run Code Online (Sandbox Code Playgroud)

在onResume()中注册我的app接收器:

intentFilter = new IntentFilter(STOP_MEDIAPLAYER);
registerReceiver(dataUpdateReceiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

的onPause()

unregisterReceiver(dataUpdateReceiver);
Run Code Online (Sandbox Code Playgroud)

现在,如果我从onPause() - 方法中删除取消注册,即使app/activity不在前台,也会收到广播.但这是正确的方法吗?我从网上的教程中得到了这个注册/取消注册的内容我认为..

android android-intent android-notifications android-activity android-pendingintent

17
推荐指数
4
解决办法
1万
查看次数

停止Android alarmmanager的setrepeat

我已经创建了警报,如下所示

Intent intent = new Intent(this, Areceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 1234567, intent, 0);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, timenow, 3000, sender);
Run Code Online (Sandbox Code Playgroud)

我创建了一个按钮来停止闹钟.在onclick方法中,我编写了以下代码

Intent intentstop = new Intent(this, Areceiver.class);
PendingIntent senderstop = PendingIntent.getBroadcast(this,
            0, intentstop, 0);
AlarmManager alarmManagerstop = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManagerstop.cancel(senderstop);
Run Code Online (Sandbox Code Playgroud)

但工作并没有停止.可能是什么问题?

android alarmmanager android-pendingintent

16
推荐指数
1
解决办法
1万
查看次数

如何通过PendingIntent发送数据到广播?

我正在尝试通过PendingIntent一些额外的数据发送,例如:

MyMessage message;
//...
Intent intent;
SmsManager sms = SmsManager.getDefault();
intent = new Intent(Constants.SENT_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L)
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
intent = new Intent(Constants.DELIVERED_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId());
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI);
Run Code Online (Sandbox Code Playgroud)

然后在Broadcast尝试捕获数据:

@Override
public void onReceive(Context context, Intent intent) {
    String message, prefix = "";
    String action = intent.getAction();
    long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L);  //here I receive id=-1

    // blah-blah.... 
} …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-intent android-pendingintent

16
推荐指数
2
解决办法
3万
查看次数

Android:使用Context.startService和PendingIntent.getService启动服务

Context.startService

Intent intent = new Intent(context, MyService.class);
context.startService(intent);
Run Code Online (Sandbox Code Playgroud)

PendingIntent.getService

Intent intent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);
pi.send();
Run Code Online (Sandbox Code Playgroud)


问题

  1. 您何时可以使用Context.startService与PendingIntent启动服务?
  2. 你为什么要用另一个呢?

android android-intent android-context android-pendingintent

15
推荐指数
1
解决办法
1万
查看次数

你可以使用localbroadcasts的待定意图吗?

我有兴趣使用与本地广播挂起的意图.为了使自己清楚,我使用以下内容来注册接收器和发送广播:android.support.v4.content.LocalBroadcastManager.

我在服务中有一个本地广播接收器.我正在尝试从包含可点击项目的自定义通知布局发送本地广播.

本地广播接收器 - 只接收简单的动作意图.我尝试这样的事情无济于事:

Intent backintent = new Intent("GOTO_START_BROADCAST");
PendingIntent backIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, backintent, 0);
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification);
contentView.setOnClickPendingIntent(R.id.imageView1, backIntent);
Run Code Online (Sandbox Code Playgroud)

android android-pendingintent android-broadcast

15
推荐指数
1
解决办法
3060
查看次数

Android - 清除任务标志不适用于PendingIntent

我有一个A> B> C的任务堆栈.我目前在C上,然后我按下主页按钮.我收到通知,意图将我带到活动A.我按下通知,我在A但是如果我按回去,我会转到C,然后是B,然后是A.

我正在设置我的PendingIntent.有什么明显错误吗?

final Intent notificationIntent = new Intent(mContext, ActivityA.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);


        PendingIntent contentIntent = PendingIntent.getActivity(myContext, 0, notificationIntent, 0);
Run Code Online (Sandbox Code Playgroud)

编辑1:

我在这里尝试了这个建议:清除任务中的所有活动?

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)

但我仍然得到相同的结果.我的活动A在我的应用程序任务堆栈中开始,我按回去C,然后是B,然后是A.

我开始认为这在Android中是不可能的,或者在使用挂起的意图时是不可能的.

编辑2: 这不是需要什么标志的问题.更多的问题可能是错误的,标志似乎没有任何影响.

android android-intent android-notifications android-pendingintent

15
推荐指数
5
解决办法
9622
查看次数

将意图额外传递给android广播接收器

我创建了一个AlarmReceiver类,用作警报的广播接收器.问题是我需要从将类警报设置到广播接收器类的类中发送一些值.

setAlarmManager.java

     Intent i = new Intent(mContext, AlarmReceiver.class);
     i.putExtra(KEY_ROWID, (long)taskId); 
     PendingIntent pi = PendingIntent.getBroadcast(mContext,taskId_int,i,PendingIntent.FLAG_ONE_SHOT); 
     mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
Run Code Online (Sandbox Code Playgroud)

我需要在alarmreceiver类中从intent获取KEY_ROWID.我怎样才能做到这一点?AlarmReceiver类如下所示.

public class AlarmReceiver extends BroadcastReceiver {
          public static final String ALARM_ALERT_ACTION ="com.android.alarmclock.ALARM_ALERT";
          public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";

     @Override
      public void onReceive(Context context, Intent intent) {

             //Here I need the values from intent using bundle or anything...

    }
}
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver alarmmanager android-intent android-pendingintent

14
推荐指数
1
解决办法
1万
查看次数

取消PendingIntent

在a中使用PendingIntent时AppWidgetProvider,我使用以下代码:

views.setOnClickPendingIntent( viewId,
                PendingIntent.getBroadcast( context, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT ) );
Run Code Online (Sandbox Code Playgroud)

所以目前没有对getBroadcast方法返回的PendingIntent的引用.在特定情况下,我现在想要取消PendingIntent.有没有办法从视图中获取PendingIntent?或者是之后通过保持对它的引用来调用PendingIntent的cancel方法的唯一方法?

android android-pendingintent

14
推荐指数
1
解决办法
2万
查看次数

在 Android 12/API 31 中,地理围栏无法与 IMMUTABLE PendingIntent 配合使用。为什么?

PendingIntent 中的一个新 PendingIntent 字段是 FLAG_IMMUTABLE。

在31中,你必须指定MUTABLE或IMMUTABLE,否则你无法创建PendingIntent,(当然我们不能有默认值,那是针对失败者的)如此处引用

根据(搞笑的)Google Javadoc for Pendingintent,你基本上应该总是使用 IMMUTABLE (重点是我的):

强烈建议在创建 PendingIntent 时使用 FLAG_IMMUTABLE。仅当某些功能依赖于修改底层意图时才应使用 FLAG_MUTABLE,例如需要与内联回复或气泡一起使用的任何 PendingIntent (编辑评论:什么?)。

是的,所以我总是为地理围栏创建 PendingIntents,如下所示:

PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE)
Run Code Online (Sandbox Code Playgroud)

一直工作得很好。但是,按照上面的文档,我添加了 IMMUTABLE 标志,如下所示:

PendingIntent proximityIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_IMMUTABLE)
Run Code Online (Sandbox Code Playgroud)

现在,结果是,虽然我仍然在接收器中进行地理围栏转换,但如果我调用

List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
Run Code Online (Sandbox Code Playgroud)

它返回空!

所以,我有两个问题。

  1. 为什么 IMMUTABLE 标志导致我没有像过去那样获得触发地理围栏?

  2. 难道我做错了什么?有没有办法使用地理围栏触发器设置 IMMUTABLE?

其实我有三个问题:

  1. 为什么谷歌的文档如此混乱、糟糕、矛盾和落后?(这是一个反问句)

非常感谢指点。

android android-pendingintent android-geofence android-12

14
推荐指数
1
解决办法
6194
查看次数

AlarmManager,BroadcastReceiver和Service无法正常工作

我正在重构一些代码,以便我的应用程序每天在给定时间从网站提取数据.从我的研究来看,这似乎AlarmManager是最合适的方法.

我一直关注的教程是:http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/

到目前为止,AlarmManagerBroadcastReceiver似乎工作,然而Service似乎从来没有开始(即onStartCommand似乎没有被调用)

以下是我到目前为止的代码的重要摘要:

MyActivity.java

private void setRecurringAlarm(Context context) {
    Calendar updateTime = Calendar.getInstance();
    updateTime.setTimeZone(TimeZone.getDefault());
    updateTime.set(Calendar.HOUR_OF_DAY, 20);
    updateTime.set(Calendar.MINUTE, 30);

    Intent downloader = new Intent(context, AlarmReceiver.class);
    downloader.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    // should be AlarmManager.INTERVAL_DAY (but changed to 15min for testing)
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); 
    Log.d("MyActivity", "Set alarmManager.setRepeating to: " + updateTime.getTime().toLocaleString());
}
Run Code Online (Sandbox Code Playgroud)

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver { …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver alarmmanager android-pendingintent

13
推荐指数
1
解决办法
1万
查看次数