Pertanyaan Peluncuran ulang tombol Activity on Home, tetapi ... hanya untuk pertama kalinya


Aplikasi yang saya kembangkan memiliki perilaku aneh saat pertama kali dipasang. Jika pengguna mundur dari aplikasi biasanya pertama kali, itu akan selamanya berperilaku sebagaimana mestinya. Jika pengguna menggunakan tombol beranda pertama kali setelah menginstal aplikasi, aplikasi itu memperlakukan aplikasi seolah-olah harus meluncurkan kembali layar beranda lagi dan meluncurkan versi baru dari aktivitas di depan yang lama.

Jadi sebenarnya ada dua masalah yang dihadapi. Saya tidak bisa menyelesaikan keduanya.

  1. Jaga agar aplikasi tidak ditutup saat pertama kali dipasang saat pengguna menekan tombol beranda.
  2. Simpan beberapa versi aplikasi dari peluncuran ketika melakukan hal ini (launchMode membantu di sini sedikit, tetapi komponen pertama masih memicu).

Saya tidak punya itu launchMode atribut dalam file manifes yang didefinisikan sebagai apa pun. Jadi seharusnya tidak ada perilaku aneh sebagai hasil dari ini. Saya telah bereksperimen sekarang dengan launchmode atribut aplikasi untuk melihat apakah saya bisa membuatnya berperilaku seperti yang dimaksudkan, tetapi tampaknya ada yang lebih dari sini daripada hanya meluncurkan kegiatan dengan benar. Tidak ada alasan bahwa aplikasi harus menutup sendiri pertama kali sejauh yang saya bisa lihat ketika tombol home ditekan.

Saya tidak menggunakan onUserLeaveHint  dalam aplikasi baik. Saya harus yakin sekali lagi dengan melakukan pencarian atas proyek tersebut. Jadi sepertinya tidak ada tombol home yang di-override sama sekali.

Bahkan setelah menyalakan kembali telepon, tombol beranda berperilaku normal kembali. Tidak yakin apa yang menyebabkan pemasangan awal untuk memperlakukan tombol beranda sebagai tanda untuk memulai aplikasi dari awal.

Setelah pengguna mundur dari aplikasi pertama kali, masalah ini diselesaikan secara permanen. Setiap pikiran tentang di mana saya harus mencari?

Baru-baru ini ada pencarian dalam aplikasi untuk melihat apakah mungkin itu hanya karena itu onUpgrade() komponen dari metode database SQLite menyebabkan beberapa perilaku aneh.

@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
                if (newVersion > oldVersion) {

           }
       }

Atau di lokasi lain yang mungkin memicu pembaruan dari file manifes jika saya meneruskan versi yang lebih baru dari APK bersama ke perangkat yang memiliki versi di atasnya yang sudah lebih rendah dari yang sekarang. Namun, tidak ada bagian dari kode ini yang membuat saya percaya bahwa itu akan memengaruhi apa pun yang terkait dengan urutan peluncuran.

File manifes (dengan nama yang diubah) disediakan di bawah ini untuk apa yang saat ini digunakan dalam aplikasi.

<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="com.android.vending.CHECK_LICENSE"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<uses-permission android:name="android.permission.VIBRATE" android:required="false"/>
<uses-permission android:name="android.permission.CAMERA" android:required="false"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>

<application android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:allowBackup="false"
             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
             >
    <activity android:name=".MyMain"
              android:label="@string/app_name_with_version"
              android:screenOrientation="portrait"
              android:windowSoftInputMode="adjustPan"   />
    <activity android:name=".StartupActivity"
              android:label="@string/app_name"
              android:screenOrientation="portrait"
              >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity   android:name=".SelectActivity"  
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".ImageSelectionActivity"
                android:theme="@android:style/Theme.Dialog"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:configChanges="orientation|keyboardHidden"/>            
    <activity   android:name=".DetailsActivity"
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"/>
    <activity   android:name=".EMailActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".SendTo" 
                android:label="@string/share_label" 
                android:theme="@android:style/Theme.Dialog" >
        <INTENT-FILTER>  
            <ACTION android:name="android.intent.action.MAIN">  
            <CATEGORY android:name="android.intent.category.LAUNCHER"/>  
            <INTENT-FILTER>  
                <ACTION android:name="android.intent.action.VIEW">  
                <CATEGORY android:name="android.intent.category.DEFAULT">  
                    <CATEGORY android:name="android.intent.category.BROWSABLE">  
                    <DATA android:scheme="callback" android:host="twitter"/>  
                    </CATEGORY>  
                </CATEGORY>
                </ACTION>
            </INTENT-FILTER>
            </ACTION>
        </INTENT-FILTER>
    </activity>
    <activity   android:name=".CreateMyActivity"
                android:label="@string/create_account_label"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".ViewInLayoutActivity"
                android:label="@string/app_name_with_version"   
                android:screenOrientation="portrait"/>
    <activity   android:name=".Preferences"
                android:label="@string/set_preferences" 
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>
    <activity   android:name=".AboutActivity"   
                android:label="@string/app_name_with_version"       
                android:screenOrientation="portrait"/>
    <activity   android:name=".InteractiveActivity" 
                android:label="@string/app_name_with_version"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Dialog"/>   
    <activity   android:name=".AlertFailedCommunications"
                android:screenOrientation="portrait"
                android:label="@string/alert_account_label"
                android:theme="@android:style/Theme.Dialog"/>
</application>    


37
2018-04-29 15:59


asal


Jawaban:


Selamat datang di daftar pengguna yang terus bertambah yang telah digigit oleh yang satu ini.

Ini adalah sebuah bug Android terkenal dan lama. dalam cara aplikasi diluncurkan pertama kali dari penginstal, web-browser dan via IDE (IntelliJ, Eclipse, dll.). Lihat masalah-masalah ini diajukan lama terkait dengan masalah:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

Itu masih rusak dan Anda tidak dapat mencegah hal ini terjadi. Satu-satunya hal yang dapat Anda lakukan adalah mendeteksi saat Android meluncurkan instance kedua dari aktivitas root Anda ke dalam tugas yang sudah ada. Anda dapat melakukan ini dengan memasukkan kode ini onCreate() dari aktivitas root Anda:

if (!isTaskRoot()) {
    // Android launched another instance of the root activity into an existing task
    //  so just quietly finish and go away, dropping the user back into the activity
    //  at the top of the stack (ie: the last state of this task)
    finish();
    return;
}

56
2018-05-08 18:17



Mengapa ini berperilaku, tidak ada petunjuk. Tapi saya tahu kebiasaan itu Launcher memiliki spesifik launchModes set.

Misalnya ADW.Launcher:

android:clearTaskOnLaunch="true"
android:launchMode="singleTask" 

Aplikasi rumah di sampel Android SDK: android-sdk\samples\android-16\Home\AndroidManifest.xml

android:launchMode="singleInstance"

Untuk mengutip CommonsWare: Bagaimana cara mencegah aktivitas memulai kembali aplikasi peluncur khusus?

Saya akan menggunakan aplikasi sampel Rumah dari SDK, yang menggunakan   singleInstance. Anehnya, peluncur AOSP menggunakan singleTask


4
2018-05-02 12:38



Sepertinya masalahnya disebabkan oleh berbagai contoh aplikasi. Mungkin contoh pertama diluncurkan di bawah tugas penginstal dan yang kedua adalah di bawah tugasnya sendiri, ketika pengguna mengklik ikon aplikasi. Tampaknya pengguna dia resume aplikasi tetapi sebenarnya dia meluncurkan lagi pada saat ini.

Jika Anda ingin menjalankan aplikasi hanya dalam tugasnya sendiri, cara yang memungkinkan adalah dengan menambahkan

android:allowTaskReparenting="true"

ke tingkat aplikasi AndroidManifest Anda. Setelah ikon aplikasi diklik untuk pertama kalinya setelah instalasi, aplikasi Anda akan dipindahkan ke tugas yang terpisah.


0
2018-05-29 18:18