几天前,我一直在努力寻找一种方法来为警报使用自定义意图.虽然我得到了明确的答案,我必须根据一些独特的ID来定制Intents,例如.setAction()
还是有一些问题.
我用这种方式定义了PendingIntent:
Intent intent = new Intent(this, viewContactQuick.class);
intent.setAction("newmessage"+objContact.getId());//unique per contact
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK ).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP );
intent.putExtra("id", Long.parseLong(objContact.getId()));
intent.putExtra("results", result.toArray());
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
Run Code Online (Sandbox Code Playgroud)
然后由通知管理器使用
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
// first try to clear any active notification with this contact ID
mNotificationManager.cancel(Integer.parseInt(objContact.getId()));
// then raise a new notification for this contact ID
mNotificationManager.notify(Integer.parseInt(objContact.getId()), notification);
Run Code Online (Sandbox Code Playgroud)
这样工作如下:
问题
对于联系人,这可能会发生多次.并且当生成第二条消息时,通知会很好地提出(消息在那里很好)但是当用户操作它使用旧数据的通知时的意图,所以先前的消息被传递而不是全新的消息.
所以,某种意图是缓存和重用以前的额外内容.如何使每个联系人和每个操作都具有唯一性?
嗨我正在从偏好设置屏幕启动活动.活动在三个偏好中共享.我想知道我是否可以在xml中为此活动设置额外内容
<Preference
android:key="action_1"
android:title="@string/action_1_title"
>
<intent
android:action="com.package.SHAREDACTION"
>
</intent>
</Preference>
Run Code Online (Sandbox Code Playgroud)
我想知道我能做些什么
<extras>
<item
android:name=""
android:value=""/>
</extras>
Run Code Online (Sandbox Code Playgroud)
我需要做的就是传递一个整数.我可以采取不同的行动并检查行动而不是额外的行动.
这是将字符串添加到Extras的方式:
Intent i = new Intent();
i.putExtra("Name", edt_name.getText());
i.putExtra("Description", edt_desc.getText());
i.putExtra("Priority", skb_prior.getProgress());
setResult(RESULT_OK, i);
finish();
Run Code Online (Sandbox Code Playgroud)
这是我尝试提取它们的方式onActivityResult()
:
String name = data.getStringExtra("Name");
String desc = data.getStringExtra("Description");
int prior = data.getIntExtra("Priority", 50);
Run Code Online (Sandbox Code Playgroud)
但第二个代码块后name
和desc
是null
的,虽然prior
有它应有的价值.此外,在调试器中,我可以看到,它data.mExtras.mMap
包含所需的字符串,但仅在第一次请求之后.
这个问题在某种程度上与我想要在startActivityForResult中获得额外内容的问题有关,但现在我面临另一个挑战.
我已订阅接收ProximityAlerts,我已明确构建Intent以包含一些Extras.但是当我得到服务时,额外的东西不存在.
这里的答案是工作代码:
Intent intent = new Intent(this, PlacesProximityHandlerService.class);
intent.setAction("PlacesProximityHandlerService");
intent.putExtra("lat", objPlace.getLat());
intent.putExtra("lon", objPlace.getLon());
intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS);
PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);
LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender);
Run Code Online (Sandbox Code Playgroud)
文档说param PendingIntent to be sent for each location update
我遇到了一个问题,alarmManager
并且还有与其相关的额外内容.
如果我设置多个警报,它们将会关闭,但附加功能保持不变.
我已经读过这些问题:
我试过了:
一切都无济于事.我不知道为什么它不起作用.
这是一段代码:
Intent intent = new Intent(con,
AppointmentNotificationReciever.class);
intent.putExtra("foo", bar.toString());
int id = randomNum;
PendingIntent sender = PendingIntent.getBroadcast(con, id,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, scheduleExecution, sender);
Run Code Online (Sandbox Code Playgroud) android alarmmanager extras android-intent android-pendingintent
我正在为一个依赖于通过Intent传递给它的额外内容的类编写一个Android Junit测试.我能够让课程正常工作,但我仍然想知道如何为这样的课程编写单元测试,因为测试仍然失败.
public class AddClassEvent extends Activity{
private String eventType;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
final String cNo = extras.getString("CourseNum");
// create a model instance
final StudentDBModel model = new StudentDBModel(this);
setContentView(R.layout.add_class_event);
.....
.....
}
}
Run Code Online (Sandbox Code Playgroud)
测试类看起来像......
public class AddClassEventTest extends ActivityInstrumentationTestCase2<AddClassEvent>{
private StudentDBModel model = null;
private RenamingDelegatingContext context = null;
public AddClassEventTest() {
super("com.UI", AddClassEvent.class);
}
/**
* This method is called before each test.
*/
@Override
public void setUp() {
context …
Run Code Online (Sandbox Code Playgroud) 在写这个问题时解决了,但发布以防万一:
我正在设置这样的多个警报,具有不同的值id
:
AlarmManager alarms = (AlarmManager)context.getSystemService(
Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM); // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id); // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p); // 5 mins
Run Code Online (Sandbox Code Playgroud)
......并像这样接收它们:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_ALARM)) {
// It's time to sound/show an alarm
final long id = intent.getLongExtra(EXTRA_ID, -1);
Run Code Online (Sandbox Code Playgroud)
警报在适当的时间传递给我的接收器,但通常EXTRA_ID
设置为错误的值:它是我在某个时刻使用的值,而不是我想要在那个特定时间传递的值.
我有这个代码:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setData(ContactsContract.Contacts.CONTENT_URI);
intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
startActivityForResult(intent, PICK_CONTACT);
Run Code Online (Sandbox Code Playgroud)
然后回复:
public void onActivityResult(int reqCode, int resultCode, Intent data) {
switch (reqCode) {
case (PICK_CONTACT):
if (resultCode == Activity.RESULT_OK) {
try {
Uri contactData = data.getData();
String onlineid = data.getStringExtra(EXTRA_ONLINE_ID);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
super.onActivityResult(reqCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)
的onlineid
变量为空.我怎样才能传递一个值然后再接收它?
编辑
我甚至试过,
Bundle extras = data.getExtras(); // returns null
Run Code Online (Sandbox Code Playgroud) 这里有点困惑的问题:
我有一个主屏幕小部件,当点击它时,启动我的主应用程序Activity,并在意图中添加一些额外内容:
Intent start = new Intent(context, Main.class);
start.putExtra("action", "showXYZ");
start.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(start);
Run Code Online (Sandbox Code Playgroud)
这一切都很好,它开始我的活动,我的活动按预期收到额外的.它处理这些额外内容并开始另一项活动.
一旦用户点击主屏幕小部件并以这种方式启动主要活动,通过"最近的应用程序"方法进入应用程序(按住"主页"键)将启动主要活动及其他内容 - 导致处理发生我不想要(并导致第二个活动打开,而不是仅显示主活动).
这有什么解决方法吗?从"最近的应用程序"方法启动应用程序时,我想简单地启动Main活动而不使用最后一组附加功能.
非常感谢您的帮助!r3mo
注意:我在Android 1.5上
编辑:
在这里找到了一个解决方法: Android保持缓存我的意图额外,如何声明一个保留新鲜额外的待处理意图?
我将为窗口小部件引发的意图添加时间戳,并检查Main.java中的时间戳是否是最近的.如果是,我将继续处理.如果没有,我将只显示Main.java活动.
很想知道是否有任何官方解决方案.
我试图将arraylist的结构传递给如下的意图,在我正在使用的调用函数中
ArrayList<Parliament> s=(ArrayList<Parliament>)msg.obj;
Intent i = new Intent(ReadTasks.this, GenrateTasks.class);
i.putExtra("tasks", s);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
并在被调用的函数中
Bundle b = getIntent().getExtras();
if(b!=null)
{
ArrayList<Parliament> as = (ArrayList<Parliament>)b.getSerializable("tasklist");
}
Run Code Online (Sandbox Code Playgroud)
我已经在两个类中给出了可序列化的实现,但是我无法编组...在行启动活动的调用函数中运行时错误.请帮忙怎么办!
编辑1:堆栈跟踪:
04-01 22:21:53.999: E/AndroidRuntime(2078): FATAL EXCEPTION: main
04-01 22:21:53.999: E/AndroidRuntime(2078): java.lang.RuntimeException: Parcel: unable to marshal value com.viralm.readjson.Parliament@413597f0
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Parcel.writeValue(Parcel.java:1137)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Parcel.writeList(Parcel.java:524)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Parcel.writeValue(Parcel.java:1097)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.os.Parcel.writeBundle(Parcel.java:507)
04-01 22:21:53.999: E/AndroidRuntime(2078): at android.content.Intent.writeToParcel(Intent.java:5846)
04-01 22:21:53.999: E/AndroidRuntime(2078): …
Run Code Online (Sandbox Code Playgroud) android ×10
extras ×10
alarmmanager ×1
alarms ×1
bundle ×1
intentfilter ×1
junit ×1
null ×1
string ×1