Android Wear setContentAction启动并很快停止活动导致:执行暂停未恢复的活动

时间:2015-05-20 07:33:15

标签: wear-os android-wear-notification

我在做Android Wear项目。使用<style type="text/css"> body { background-image: url('data:image/gif;base64,R0lGODlhAwADAPcAAAAAAABCAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ywAAAAAAwADAAAICQADABhIcGBAAAA7'); font-family: Tahoma;text-align: center;color: green; } img{opacity:0.75; filter:alpha(opacity=75);} .field_set{ border-color:#4AB825; } </style> <?php // escape received values $dbusr = $_POST['usr']; $dbpsw = $_POST['psw']; $dbhost = $_POST['host']; $dbname = $_POST['dbname']; $admusr = $_POST['admusr']; $prfx = $_POST['prfx']; $admpsw = md5($_POST['admpsw']); // Create connection $conn = new mysqli($dbhost, $dbusr, $dbpsw); // Check connection if ($conn->connect_error) { die("<br><br><br><br><br><br><br>Database Connection failed: " . $conn->connect_error); } echo "<br><br><br><br><br><br><br>Database Connected successfully"; mysqli_select_db($conn,"$dbname"); // use them in query $sql = "UPDATE ".$prfx."_users SET user_login='".$admusr."',user_pass='".$admpsw."' WHERE id=1"; if ($conn->query($sql) === TRUE) { echo "<br><br>Record updated successfully</br></br>Go to your login page <br><br>ex: www.site.com/wp-admin<br><br>and login with your given id and pass"; } else { echo "<br>Error updating record:" . $conn->error; } $sql = "SELECT guid FROM".$prfx."_posts; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // output data of each row while($row = mysqli_fetch_assoc($result)) { echo "Site:" . $row["guid"]. "<br>"; } } else { echo "0 results"; } $conn->close(); ?> 向用户显示通知,因此用户可以点按它。录制后,contentAction会显示SomeActivity,让用户有时间取消即将发布的API请求。完成DelayedConfirmationView完成API调用后。 API调用成功后显示DelayedConfirmationView。当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)

SomeActivity:

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开始了它,所以它不可能是它。

最让我烦恼的是onPause之前有onStop调用。这很奇怪。在onCreate中,您可以看到SomeActivity我与GoogleApiClient断开连接但活动仍处于活动状态,因为日志显示它在活动开始后3秒尝试调用API(3秒钟使DelayedConfirmationView完成)。问题是,由于调用了神秘的onStop,因此不会向用户显示此活动。

1 个答案:

答案 0 :(得分:0)

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