小编dav*_*ino的帖子

SINGLE_TOP | CLEAR_TOP似乎在95%的时间都有效.为什么5%?

我有一个几乎完成的应用程序与非平凡的活动结构.有与此应用程序关联的推送通知,并且无论应用程序是前台/后台/未激活,选择通知条目都应该启动特定活动.

如果应用程序未处于活动状态,我可以成功启动应用程序并自动导航到相应的部分.但是,当应用程序处于活动状态时,我遇到了问题.我将提出问题的简化版本,以传达问题的本质,我将根据需要发布我的应用程序的活动结构和相关代码的详细信息(实际上,现在正在处理).

所以,我的应用程序的活动堆栈(大大简化)看起来像这样:

A - > B - > X.

其中A,根活动,是一个登录页面; B是"主页",X是可以从主页启动的几个活动之一(但一次只有一个活动;因为这些只能从B开始).

当选择通知时,我需要应用程序自动导航到B,无论事先处于什么状态 - 无论是[A],[A - > B],[A - > B - > X]还是[](应用程序未激活).

我的通知将Intent传递给活动A.我尝试过使用CLEAR_TOP和NEW_TASK标志,但没有.目前有launchmode = singleTask.这样做,我想我正在解决所有可能的现有堆栈配置并将它们减少到[A].Intent还带有一个额外的内容,它将其标识为来自通知,而不是通常的发布.

活动A,在识别出从通知发送的Intent时(它可以在onCreate()和onNewIntent()中执行此操作),将Intent发送到Activity B.此Intent包含CLEAR_TOP和SINGLE_TOP.B有launchmode = singleTop.

95%的时间,这可以按照需要工作,按下通知后,应用程序的堆栈为[A - > B].大约5%的时间,应用程序不知何故最终得到一堆[A - > B - > B].

关于这里发生了什么,或者我做错了什么的任何想法?

如果事实证明这是一个非常重要的问题,我会发布更多细节.事实上,现在发布更多细节......

~~~~~~~~~~~~~~~~~~~~~~~详细信息~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

单步执行调试器会显示,每次A将其意图发送给B时,现有的B实例都是onDestroy(),然后才能进入onCreate(),然后调用onNewIntent().这对我来说似乎很奇怪,并且暗示我误解了我正在使用的标志(CLEAR_TOP和SINGLE_TOP),或者其他东西正在干扰它们.

我没有成功地在调试中重现错误的堆栈结构.不确定是不是因为它没有在调试中发生,或者我没有尝试过足够的次数.

意图代码:

在C2DM接收器服务中:

protected void onMessage(Context context, Intent intent) {
    int icon = R.drawable.some_drawable;
    CharSequence tickerText = "blah";
    long when = System.currentTimeMillis();
    Notification notification = new Notification(icon, tickerText, when);

    //Context context = getApplicationContext(); //Don't …
Run Code Online (Sandbox Code Playgroud)

android android-intent launchmode android-activity

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

活动已泄露窗口/对话框(再次!)

是的,我已经阅读了关于同样问题的无数问题.

我的代码很简单:我只是用showDialog(int id)onCreate,然后我旋转设备.代码就是那个(测试用例),这足以导致问题.我的理解是,showDialog方法会处理这个......对话框会消失,然后onCreate在更改后稍后调用,再次干净地显示对话框.但不是.这个推理有什么问题?

我(我想)了解原因,但我不知道如何解决这个问题.即使是iosched应​​用程序在实现EULA窗口时也存在同样的问题(在eula对话框上更改方向并且您会收到泄漏).我已经阅读了关于关闭onPause的对话框的内容,但是1)我没有显示它的风险,并且2)跟踪对话似乎太多了.必须有一个更强大的方法.

那么......处理这个问题需要哪些更干净的代码呢?

谢谢.


日志错误输出:

01-30 00:27:18.615: E/WindowManager(20316): Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here
01-30 00:27:18.615: E/WindowManager(20316): android.view.WindowLeaked: Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here
01-30 00:27:18.615: E/WindowManager(20316):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:343)
01-30 00:27:18.615: E/WindowManager(20316):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:245)
01-30 00:27:18.615: E/WindowManager(20316):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
01-30 00:27:18.615: E/WindowManager(20316):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
01-30 00:27:18.615: E/WindowManager(20316):     at android.view.Window$LocalWindowManager.addView(Window.java:537)
01-30 00:27:18.615: E/WindowManager(20316):     at …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks dialog window android-activity

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

添加CornerPathEffect时FillType.EVEN_ODD的不同行为?

我在Drawable这里试验,发现了一些我无法解释的东西,希望有人可以帮助我.

为什么加入CornerPathEffectPaint似乎"破"(?)的EVEN_ODD FillType

更具体地说,我正在按原样测试这个HexagonDrawable类.这就是我得到的:

硬角,概述,预期的行为.

但是,如果我设置CornerPathEffectPaint,如下所示(构造函数)...

public HexagonDrawable(int color) {
    paint.setColor(color);
    paint.setPathEffect(new CornerPathEffect(6)); // added
    hexagon.setFillType(Path.FillType.EVEN_ODD);
}
Run Code Online (Sandbox Code Playgroud)

......这就是我得到的:

圆角,轮廓效果消失,意外行为?

圆角,是的,但没有轮廓的外观(奇数/偶数/奇数).有人可以解释一下原因吗?

android path paint shape drawable

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

Android中的应用内结算问题

我对android中的In-Application-Billing有一些疑问:

  • 我可以使用不同的产品ID测试它而无需支付25美元

  • 在下面的链接中,可以选择在产品发布到市场后添加产品然后如何添加到ListView或Spinner等程序UI以向用户显示?

    http://developer.android.com/guide/market/billing/billing_admin.html#billing-testing-setup

  • 从最初我们把价值放在购买数据库的地方.如果不止一个人使用app,它应该如何改变.如果它在设备上,那么如果同一个iTem将由两个人购买它们将如何同步?

  • 如何生成ProductID?

android in-app-purchase in-app-billing

12
推荐指数
1
解决办法
1786
查看次数

在Android Play/Market中更改过滤器和现有应用程序要求的副作用

以前没有关于它的问题,所以我在这里问.

背景:

我在Play Market中有一个免费和付费版本的旧应用程序.我创建了一个新版本,从根本上改变并使用不同的支付系统(免费应用+仅在应用内购买,不再是付费版本:降低维护成本).minSdkVersion也从1.5变为2.1.

由于所有这些差异,我决定上传一个新的应用程序,而不仅仅是更新当前的应用程序(即,没有选择性地为API 7+提供新的apk ---多个APK).这一点尤为重要,因为新的支付系统,因为我不想强迫老的付费客户再次购买所有东西.我想让他们一个人幸福,因为他们(4.4/4.7评级).简而言之,我不想"强迫"人们做任何事情.在这种情况下,为通过应用内,购买再买同样的事情,除了其他的东西,新的应用提供的.

问题:

在向您解释了我的背景后,它提出了一些显而易见的问题:

1.我如何隐藏API 7+受众的旧应用程序,同时仍然让所有当前API 7+客户都可以看到它们,即那些已经购买过它们的客户?

我最关心的是付费应用.我正在考虑推出一个maxSdkVersion设置为6 的新版本(SDK 2.0.1),有效地阻止新的API 7+客户使用旧版应用程序.但我担心当前的API 7+客户会突然失去对该应用的访问权限.这提出了两个问题:

2.他们能不能继续更新应用程序吗?猜"是"是否合理?

3.即使上一个问题的答案为"是",我仍然不清楚如果用户卸载应用程序会发生什么,然后再在市场中再次找到它(而不仅仅是更新).它会消失还是会出现在他的"已购买"应用列表中,考虑到同时应用过滤器要求发生了变化?

备注:我会上传一个测试应用程序来查看,但AFAIK作者不允许购买他自己的应用程序(即使许可证的行为也不同),所以我无法测试卸载过滤器安装方案.




######回复答案:#######

@活泼的:

我觉得你弄错了.我知道我的方式围绕多个APK,当然还有文档.这里存在的问题远不止于此.

另请注意,这maxSdkVersion已被弃用,因此,当您发布新APK时,这会给您的提案带来一些限制,以限制旧版APK.

谢谢.我错过了.

多个APK提供更简单的用户故事.

如果你这样说(除了我没有引用的其他内容),我想你可能没有解决这个问题.请跟我来:

  1. 我有n个付费客户购买了我当前的专业应用程序版本.
  2. 他们正在使用Pro版本中的功能集X.
  3. 我现在决定实施应用内购买以提供X,Y等功能集......
  4. 不幸的是,app API 7+做出了这些更改.
  5. 因此,正如您所建议的那样,我决定提供多个APK.
  6. 现在,API 7+人群突然更新到我的应用程序的这个新版本.
  7. 因为他们更新到新的APK,他们LOSE的功能集X.他们现在需要再次购买X(来自应用内购买菜单).我从他们身上拿走了他们已经拥有的东西,尽管是"不那么闪亮"的方式.就像我说的那样:

你要么再付钱给我,要么你失去了你已经拥有的东西.

你现在看到了问题吗?你明白为什么我被迫提供一个新的应用程序?或者我仍然没有得到你所说的(我想不是)?

android side-effects filter google-play

11
推荐指数
1
解决办法
321
查看次数

在蓝牙连接事件中发送消息时不接收AppMessage回调

标题总结了它.同样的问题在这里.发布SO以查看我是否可以获得任何帮助.我还做了一个几乎最小的项目来演示我面临的问题,所以后面的链接指向所提到的代码片段.

我目前正在做的事情一无所知:

  1. 使用时,我的表盘会通知手机的蓝牙连接已启动.pebble_app_connection_handler.
  2. 蓝牙回调我设置了,我一个消息到手机上使用app_message_outbox_send().当然,当BT连接启动时.
  3. 我的Android应用程序有一个BroadcastReceiver侦听这些消息并调用IntentService.
  4. 这将IntentService 计算数据,将其推送到手表并在一段时间后将其设置为再次运行.

我期待的是:

  1. 当BT连接启动时,将调用连接处理程序.
  2. app_message_outbox_send()返回一个值,告诉消息启动是否有任何错误.通常,这是APP_MSG_OK,但它可以APP_MSG_BUSY,而且我完全清楚这一点.
  3. 调用app消息回调(app_message_register_inbox_received和朋友)以指示向电话发送消息的异步过程是否真的有效.这在文档中说明.

我所看到的:

加载表盘时会发生预期的步骤,因为我会手动触发更新.但是,当BT连接事件触发更新时,会发生预期的步骤1和2,但不会执行步骤3.

这是特别严重的,当我APP_MSG_OK在第2步,因为我应该有理由期待手表的一切都OK,我就准备自己接受一些应用程序消息回调里面.基本上,文档告诉我等待一个永远不会到来的电话.

这种情况100%发生.

感谢您的任何帮助.我有另一个解决方案,使用手表来跟踪更新间隔,但我相信这个允许我通过利用最近的Android功能节省更多的电池.

asynchronous bluetooth callback pebble-watch pebble-appmessage

10
推荐指数
1
解决办法
132
查看次数

由于APK文件无效,Eclipse安装失败了?

我使用Eclipse开发Android应用程序,但在运行项目时看到此错误:

Installation failed due to invalid APK file!

eclipse android installation-package apk

9
推荐指数
3
解决办法
4万
查看次数

在Android中收听ENTER键

这是我的代码:

public class CaptureENTER extends Activity implements OnKeyListener{

/* on create and other stuff in here*/

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
           Toast.makeText(LiVoiceActivity.this,
                                     "YOU CLICKED ENTER KEY",
                                     Toast.LENGTH_LONG).show();

        }       
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

我不知道发生了什么,但当我按下键盘上的ENTER键(我正在使用Android模拟器)时,事件未激活.

我错过了什么?

android enter keylistener

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

在Android中为用户解锁应用功能的最佳做法是什么?

我刚刚开发了一个Android应用程序,我想免费分发.

为了能够为我的工作赚取一些钱,我想在应用中添加一些广告或通知.如果用户决定捐出一些钱,他将使用某种解锁代码收到"捐赠"版本的解锁代码.

在Android中实现这个有什么"最佳实践"吗?

谢谢!

java android donations

8
推荐指数
2
解决办法
2610
查看次数

可以依赖SQLiteConstraint让SQLite为我做检查吗?有捕获吗?

我在Android中有一个SQLite数据库,我使用a ContentProvider来处理操作,这些操作被持久化到一个列中带有UNIQUE限定符的表.

问题:

但是,当我insert将值复制到数据库中时,它本身并没有破坏我的代码,但它仍然会吞噬数千条SQLiteConstraintException日志行,而对我的用户来说,只是感觉污染了日志,这是一些未经修改的东西.我试过捕获异常只是为了实验,但它仍然记录.

题:

那么,我该如何沉默那些日志行呢?这甚至可能吗?

请阅读下面的评论,以了解提问的原因.

错误:

时间列具有UNIQUE约束:

Error inserting Factor=2.0 Time=1325375465000 Extra=none
android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
    at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
    at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
    at mypackage.myapp.provider.DataProvider.bulkInsert(DataProvider.java:353)
    at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:179)
    at android.content.ContentResolver.bulkInsert(ContentResolver.java:646)
    at mypackage.myapp.service.MyService.onHandleIntent(MyService.java:96)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.os.HandlerThread.run(HandlerThread.java:60)
Run Code Online (Sandbox Code Playgroud)

sqlite android exception-handling constraints insert

8
推荐指数
1
解决办法
2334
查看次数