Приложение возвращается к первому действию, если оно приостановлено и перезапущено с иконки запуска - PullRequest
0 голосов
/ 04 сентября 2018

По сути, всякий раз, когда я запускаю второе действие и приостанавливаю приложение и перезапускаю приложение, нажимая на его значок в панели запуска, приложение не возобновляет второе действие, а возвращается к первому действию. Кроме того, если я приостанавливаю приложение (просмотр в диспетчере задач), которое делает приложение, снова показывает всю активность, как очень быстро (разговор в миллисекундах), а затем переходит к диспетчеру задач.

Файл манифеста

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:replace="android:icon">
    <activity
        android:name=".Activity.MainActivity"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Activity.ReferenceActivity"
        android:configChanges="orientation|screenSize" /> <!-- Find a better solution for orientation change -->

    <meta-data
        android:name="preloaded_fonts"
        android:resource="@array/preloaded_fonts" />

    <activity android:name=".Activity.AboutActivity"></activity>
</application>

Поскольку вы бы заметили, что launchMode установлен в "singleTask", есть причина этого. Мое приложение содержит вид переработчика. Его данные обновляются со второго действия. Если для launchMode не задано значение singleTask, данные повторного просмотра не обновляются, поэтому для обновления данных мне пришлось перезапустить все приложение, чтобы увидеть какое-либо изменение данных. Это временное решение, но я надеюсь, что кто-нибудь поможет мне и в этом вопросе.

О том, что представление Рейклера не обновляется, я задавал этот вопрос бесчисленное количество раз, но так и не нашел решения. Да, я пережил, вероятно, сотни подобных проблем со стеком над потоком, и ни одна из них не работает. Пожалуйста, имейте в виду, что я новичок в разработке для Android, поэтому у меня нет знаний по таким сложным вещам, как MvvM, RxJava или архитектура живых данных.

P.S Так же, как любой дает решение, что я снова вызываю функцию загрузчика данных где-то в onStart или в Resume, я пробовал это бесчисленное количество раз, и это не работает. Мое приложение не использует фрагменты или любые другие сложные вещи, а только основные действия. Любая помощь приветствуется!

Второе занятие

class ReferenceActivity : AppCompatActivity() {

private var dbHandler: PediaDatabase? = null
private var note = UserNotes()
private var noteExisted: Boolean = false
private var cardAdapterPos: Int? = null
private var title: String? = null
private var text: String? = null
private var sharingMenuOpened: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_reference)


    val toolbarRef: Toolbar = findViewById(R.id.toolbarRefID)
    setSupportActionBar(toolbarRef)

    val toolbarTxtView = findViewById<TextView>(R.id.refToolbarTitleID)
    supportActionBar!!.setDisplayShowTitleEnabled(false)

    overridePendingTransition(R.anim.slide_in, R.anim.slide_out)




    dbHandler = PediaDatabase(this)
    val data = intent
    if (!isNewNote) {
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)

        if (data != null) {
            noteExisted = true

            this.cardAdapterPos = data.extras.getInt("cardPosition")
            cardID = data.extras.getInt("cardID")


            existingNote = dbHandler!!.readNote(cardID)

            text = existingNote.noteText
            title = existingNote.noteTitle

            refTitleID.setText(existingNote.noteTitle, TextView.BufferType.EDITABLE)
            refTextID.setText(existingNote.noteText, TextView.BufferType.EDITABLE)
            toolbarTxtView.text = "Created: " + existingNote.noteDate.toString()



        }
    } else {
        toolbarTxtView.text = "New note"

        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
    }
}

override fun onResume() {
    super.onResume()
    sharingMenuOpened = false
}


override fun onPause() {
    super.onPause()

    if (!sharingMenuOpened)
        saveNote()
}


override fun onCreateOptionsMenu(menu: Menu?): Boolean {

    menuInflater.inflate(R.menu.top_menu, menu)
    val addItem: MenuItem = menu!!.findItem(R.id.add_note_menu)
    val delItem: MenuItem = menu.findItem(R.id.delete_note_menu)
    val shareButton: MenuItem = menu.findItem(R.id.shareID)


    addItem.isVisible = false
    delItem.isVisible = false
    shareButton.isVisible = false

    if (noteExisted) {
        delItem.isVisible = true
        shareButton.isVisible = true
    }

    return true
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {

    if (item!!.itemId == R.id.delete_note_menu) {

        val deletionMsg = SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE)
        deletionMsg.titleText = "Delete this note?"
        deletionMsg.confirmText = "Yes"
        deletionMsg.setCancelable(false)



        deletionMsg.setConfirmClickListener(object : SweetAlertDialog.OnSweetClickListener {
            override fun onClick(sweetAlertDialog: SweetAlertDialog?) {

                dbHandler!!.deleteNote(cardID)


                deletionMsg.dismissWithAnimation()

                val successMsg = SweetAlertDialog(this@ReferenceActivity, SweetAlertDialog.SUCCESS_TYPE)
                successMsg.setCancelable(false)
                successMsg.titleText = "Note deleted!"

                successMsg.setConfirmClickListener(object : SweetAlertDialog.OnSweetClickListener {
                    override fun onClick(sweetAlertDialog: SweetAlertDialog?) {

                        successMsg.dismissWithAnimation()
                        finish()
                    }

                }).show()
            }
        })

        deletionMsg.setCancelButton("No", object : SweetAlertDialog.OnSweetClickListener {
            override fun onClick(sweetAlertDialog: SweetAlertDialog?) {
                deletionMsg.dismissWithAnimation()
            }
        })
        deletionMsg.show()



    }

    if (item.itemId == R.id.shareID) {

        var sharingTitle: String = title!!.trim()
        var sharingText: String = text!!.trim()

        sharingMenuOpened = true

        val sharingIntent = Intent(android.content.Intent.ACTION_SEND)
        sharingIntent.type = "text/plain"
        val shareBody: String? = sharingText
        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, sharingTitle)
        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody)
        startActivity(Intent.createChooser(sharingIntent, "Share to"))
    }

    return super.onOptionsItemSelected(item)
}

private fun saveNote() {
    title = refTitleID.text.toString().trim()
    text = refTextID.text.toString().trim()


    if (existingNote.noteText == text && existingNote.noteTitle == title) {
        finish()
    } else {

        if (noteExisted) {

            if (TextUtils.isEmpty(title) && TextUtils.isEmpty(text)) {
                dbHandler!!.deleteNote(cardID)

                val parsedColor = Color.parseColor("#263238")
                Toasty.Config.getInstance().setInfoColor(parsedColor).apply()
                Toasty.info(this, "Note deleted", Toast.LENGTH_SHORT, true).show()
            } else {

                if (TextUtils.isEmpty(title))
                    title = "No title"

                existingNote.noteTitle = title
                existingNote.noteText = text
                existingNote.noteDate = System.currentTimeMillis().toString()

                dbHandler!!.updateNote(existingNote)
                Toasty.success(this, "Note saved", Toast.LENGTH_SHORT, true).show()


                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }

        } else {
            if (TextUtils.isEmpty(title) && TextUtils.isEmpty(text)) {
                finish()
            } else {
                if (TextUtils.isEmpty(title))
                    title = "No title"

                note.noteTitle = title
                note.noteText = text
                note.noteDate = System.currentTimeMillis().toString()

                dbHandler!!.createNote(note)
                Toasty.success(this, "Note saved", Toast.LENGTH_SHORT, true).show()


                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }
        }
    }
}

}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы вызываете метод finish() in saveNote(), который вызывается в onPause(), поэтому каждый раз, когда ваше приложение переходит в фоновый режим, текущая активность завершается (закрывается) из-за вызова в нем finish() .

Удалите вызовы на finish() в методе saveNote(), и вы вернетесь к своей текущей активности вместо того, чтобы приземлиться на панель запуска / Основное действие.

0 голосов
/ 04 сентября 2018

Вы можете попробовать использовать это в MainActivty:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (Intents.isActivityExpandedFromLauncherIcon(this)) {
        finish()
    } else {
        setContentView(R.layout.activity_main)
}
}

обн .:

public class Intents {

public static boolean isActivityExpandedFromLauncherIcon(@NonNull Activity activity) {
    return !activity.isTaskRoot() && isActivityStartedFromLauncherIcon(activity.getIntent());
}

public static boolean isActivityStartedFromLauncherIcon(@Nullable Intent intent) {
    return intent != null &&
            intent.hasCategory(Intent.CATEGORY_LAUNCHER) &&
            intent.getAction() != null &&
            intent.getAction().equals(Intent.ACTION_MAIN);
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...