【问题标题】:Android Wear setContentAction starts and soon stops Activity causing: Performing pause of activity that is not resumedAndroid Wear setContentAction 启动并很快停止 Activity 导致:执行未恢复的活动暂停
【发布时间】:2015-05-20 07:33:14
【问题描述】:

我正在做 Android Wear 项目。通知显示给用户contentAction,因此用户可以点击它。录音后SomeActivityDelayedConfirmationView 一起显示,让用户有时间取消即将到来的API 请求。当DelayedConfirmationView完成API调用时。 API 调用成功后显示ConfirmationActivity。当ConfirmationActivity 返回时,我们finish() SomeActivity 并取消通知。

我面临的问题是,在 SomeActivity 启动后,它会无缘无故地神秘停止。与崩溃一起的日志如下所示:

05-20 08:07:49.865 D/My App Wear( 7122): SomeActivity: onCreate
05-20 08:07:49.923 D/My App Wear( 7122): SomeActivity: onStart
05-20 08:07:49.923 D/My App Wear( 7122): SomeActivity: onResume
05-20 08:07:49.991 D/My App( 7122): Google API client connected
05-20 08:07:50.489 D/ViewRootImpl( 7122): changeCanvasOpacity: opaque=true
05-20 08:07:50.492 D/My App Wear( 7122): SomeActivity: onStop
05-20 08:07:53.482 E/My App( 7122): No connection to wearable available!
05-20 08:08:01.689 W/art     ( 7122): Suspending all threads took: 34.878ms
05-20 08:08:01.779 E/ActivityThread( 7122): Performing pause of activity that is not resumed: {SomeActivity}
05-20 08:08:01.779 E/ActivityThread( 7122): java.lang.RuntimeException: Performing pause of activity that is not resumed: {SomeActivity}
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3196)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3184)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3159)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread.access$1000(ActivityThread.java:144)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.os.Looper.loop(Looper.java:135)
05-20 08:08:01.779 E/ActivityThread( 7122):     at android.app.ActivityThread.main(ActivityThread.java:5221)
05-20 08:08:01.779 E/ActivityThread( 7122):     at java.lang.reflect.Method.invoke(Native Method)
05-20 08:08:01.779 E/ActivityThread( 7122):     at java.lang.reflect.Method.invoke(Method.java:372)
05-20 08:08:01.779 E/ActivityThread( 7122):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
05-20 08:08:01.779 E/ActivityThread( 7122):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
05-20 08:08:01.779 D/My App Wear( 7122): SomeActivity: onPause
05-20 08:08:01.961 E/ActivityThread( 7122): Performing stop of activity that is not resumed: {SomeActivity}
05-20 08:08:01.961 E/ActivityThread( 7122): java.lang.RuntimeException: Performing stop of activity that is not resumed: {SomeActivity}
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3309)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3390)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.app.ActivityThread.access$1100(ActivityThread.java:144)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.os.Looper.loop(Looper.java:135)
05-20 08:08:01.961 E/ActivityThread( 7122):     at android.app.ActivityThread.main(ActivityThread.java:5221)
05-20 08:08:01.961 E/ActivityThread( 7122):     at java.lang.reflect.Method.invoke(Native Method)
05-20 08:08:01.961 E/ActivityThread( 7122):     at java.lang.reflect.Method.invoke(Method.java:372)
05-20 08:08:01.961 E/ActivityThread( 7122):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
05-20 08:08:01.961 E/ActivityThread( 7122):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

创建通知被截断:

private NotificationCompat.Builder createNotification()
    {    
        NotificationCompat.Action someAction = createSomeAction();

        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this.context)
                        .setSmallIcon(R.drawable.logo)
                        .setLargeIcon(BitmapFactory.decodeResource(
                                this.context.getResources(), R.drawable.logo))
                        .setContentTitle(title)
                        .setContentText(subtitle)
                        .addAction(saveAction)

        NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender()
                .setBackground(BitmapFactory.decodeResource(this.context.getResources(), getRandomBackground()))
                .setContentAction(0)
                .setCustomContentHeight(Utils.dpToPx(100, this.context));

        notificationBuilder.extend(wearableExtender);

        return notificationBuilder;
    }

private NotificationCompat.Action createSaveAction()
    {
        Intent saveIntent = new Intent(this.context, SomeActivity.class);
        PendingIntent savePendingIntent =
                PendingIntent.getActivity(this.context, 3, saveIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationCompat.Action saveAction =
                new NotificationCompat.Action.Builder(R.drawable.save,
                        this.context.getString(R.string.save), savePendingIntent)
                        .build();

        return saveAction;
    }

一些活动:

    public class SomeActivity implements
            DelayedConfirmationView.DelayedConfirmationListener
    {
        private static final int SOME_NOTIFICATION_REQUEST_CODE = 99;
        private DelayedConfirmationView delayedConfirmationView;
        private TextView description;
        private ProgressView progressView;
        private TextView saveLabel;
        protected GoogleApiClient googleApiClient;

        @Override
        public void onCreate(Bundle bundle)
        {
            super.onCreate(bundle);
            setContentView(R.layout.activity_some);
            this.description = (TextView) findViewById(R.id.activity_some_description);
            this.delayedConfirmationView = (DelayedConfirmationView) findViewById(R.id.activity_some_delayed_confirmation);
            this.delayedConfirmationView.setTotalTimeMs(Constants.DELAYED_CONFIRMATION_ANIMATION_TIME_IN_SEC * Constants.MILIS_PER_SECOND);
            this.progressView = (ProgressView)findViewById(R.id.activity_some_progress_view);
            this.someLabel = (TextView)findViewById(R.id.activity_some_label);

            CardScrollView cardScrollView = (CardScrollView) findViewById(R.id.activity_some_card_scroll_view);
            cardScrollView.setCardGravity(Gravity.BOTTOM);

            new GetDataFromDBAsyncTask().execute();
            this.googleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(Wearable.API)
                .build();
        }

        @Override
        protected void onStart()
        {
           super.onStart();
           this.googleApiClient.connect();
        }

        @Override
        protected void onResume()
        {
            super.onResume();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    onStartTimer();
                }
            }, 500);
        }

        @Override
        protected void onPause()
        {
            super.onPause();
            this.delayedConfirmationView.setListener(null);
        }

        @Override
        protected void onStop()
        {
            super.onStop();
            if (null != this.googleApiClient && this.googleApiClient.isConnected())
            {
                Wearable.MessageApi.removeListener(this.googleApiClient, this);
                this.googleApiClient.disconnect();
            }
        }

        @Override
        public void onConnected(Bundle bundle)
        {
            Log.d(Constants.LOG_TAG, "Google API client connected");
            Wearable.MessageApi.addListener(this.googleApiClient, this);
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == SOME_NOTIFICATION_REQUEST_CODE)
            {
                WearableNotificationCenter.getInstance(SomeActivity.this).cancelNotification();
                finish();
            }
        }

        public void onStartTimer()
        {
            this.delayedConfirmationView.setListener(this);
            this.delayedConfirmationView.start();
        }

        @Override
        public void onTimerSelected(View view)
        {
            view.setPressed(true);
            // Prevent onTimerFinished from being heard.
            this.delayedConfirmationView.setListener(null);
            finish();
        }

        @Override
        public void onTimerFinished(View v)
        {
            this.delayedConfirmationView.setEnabled(false);
            this.delayedConfirmationView.setVisibility(View.INVISIBLE);
            this.progressView.setVisibility(View.VISIBLE);
            this.saveLabel.setText(R.string.saving);

            sendApiRequest();
        }

        private void showSaveConfirmation()
        {
            Intent intent = new Intent(this, ConfirmationActivity.class);
            intent.putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE,
                    ConfirmationActivity.SUCCESS_ANIMATION);
            intent.putExtra(ConfirmationActivity.EXTRA_MESSAGE,
                    getString(R.string.done));
            startActivityForResult(intent, SOME_NOTIFICATION_REQUEST_CODE);
        }

        private void sendApiRequest()
        {
            some code
        }

        @Override
        public void handleApiResponse(MessageEvent messageEvent)
        {

            showSaveConfirmation();
        }
    }

我尝试了很多方法来使其正常工作,但没有任何效果。有任何想法吗? DelayedConfirmationView 会导致这样的不当行为吗?我在网上看到了例子,他们甚至在onCreate开始,所以它不可能是它。

最困扰我的是在onPause之前调用了onStop。这很奇怪。在SomeActivity 中,您可以看到在onStop 中我与GoogleApiClient 断开连接,但Activity 仍然存在,因为日志显示它在Activity 启动后3 秒尝试调用API(DelayedConfirmationView 需要3 秒才能完成)。问题是这个活动没有显示给用户,因为神秘的onStop 被调用了。

【问题讨论】:

    标签: wear-os android-wear-notification


    【解决方案1】:

    看起来最新的操作系统更新解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多