我想在我的应用程序中添加一个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
我已经创建了警报,如下所示
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)
但工作并没有停止.可能是什么问题?
我正在尝试通过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
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)
问题
android android-intent android-context android-pendingintent
我有兴趣使用与本地广播挂起的意图.为了使自己清楚,我使用以下内容来注册接收器和发送广播: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) 我有一个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
我创建了一个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
在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方法的唯一方法?
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)
它返回空!
所以,我有两个问题。
为什么 IMMUTABLE 标志导致我没有像过去那样获得触发地理围栏?
难道我做错了什么?有没有办法使用地理围栏触发器设置 IMMUTABLE?
其实我有三个问题:
非常感谢指点。
我正在重构一些代码,以便我的应用程序每天在给定时间从网站提取数据.从我的研究来看,这似乎AlarmManager是最合适的方法.
我一直关注的教程是:http://mobile.tutsplus.com/tutorials/android/android-fundamentals-downloading-data-with-services/
到目前为止,AlarmManager并BroadcastReceiver似乎工作,然而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