18

Kullanıcının çalışma zamanında etkinleştirebildiği veya devre dışı bırakabileceği iki activity-alias uyguladık.Activity-Alias, uygulama güncellemesinde kaldırıldı

<activity-alias 
    android:name=".ui.alias.open_location" 
    android:targetActivity=".ui.activity.location" 
    android:enabled="false"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity-alias> 

Kullanıcıların cihazın uygulama ekran kaplamak değil, onları başlangıçta etkin olması istemiyoruz. Ancak çalışma zamanında, kullanıcı takma adı etkinleştirebilmelidir. Ben PackageManager ile bunu: Bu başlangıçta cazibe gibi çalışır, ama benim app bir güncelleme yüklendiğinde takma, tekrar devre dışı bırakıldığı

PackageManager pm = getApplicationContext().getPackageManager(); 
ComponentName componentName = new ComponentName(context, ".ui.alias.open_location"); 
pm.setComponentEnabledSetting(componentName, 
           PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
           PackageManager.DONT_KILL_APP); 

. Sistemin izin verilen durumun manifest tarafından üzerine yazılmasını nasıl engelleyebilirim? Kullanıcının başlangıçta Launcher ile birlikte çalışmasını istemiyorum ve kullanıcının bir güncelleme sonrasında tüm takma ad kısayollarını yeniden oluşturmasını istemiyorum.

PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER'a benzer bir şeye ihtiyacım var, ancak yalnızca etkinleştirilmiş durum için.

Teşekkürler!

+0

Bir 'String' parametresi olan bir' ComponentName 'kurucusu yok. Gerçek kodunuzu gönderir misiniz? Teşekkürler –

+0

Evet, paketimi çıkardım. Onu düzeltti. – JacksOnF1re

cevap

8

Tüm yapılandırmalar cihazın bu yolda kaydedilir (0 cihazın ilk kullanıcı için) yalnızca) bir köklü cihazdan dosya indirebiliriz:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<package-restrictions> 
    <pkg name="com.example.myapplication"> 
     <enabled-components> 
      <item name="com.example.myapplication.ActivityAlias" /> 
     </enabled-components> 
    </pkg> 
    <preferred-activities /> 
    <persistent-preferred-activities /> 
    <crossProfile-intent-filters /> 
</package-restrictions> 

Eğer etkin veya devre dışı bileşenler aynı kalır uygulamayı güncellemek zaman, uygulamanın verileri temizlemek bile.

Paketin adı veya bileşenin adı değiştiğinde, bu ayarın kaybolduğu tek durumdur.

Sorunun, bileşen adını (belki de ProGuard/DexGuard'ın bazı garip yapılandırmaları) değiştirmesinden kaynaklandığını düşünüyorum çünkü oyun deposuna farklı bir paket adıyla bir güncelleştirme yükleyemiyorsunuz.

APK'yi derlemeyi deneyebilir ve bileşenin adının her ikisinde de aynı olup olmadığını doğrulayabilirsiniz.

+0

"belki de ProGuard/DexGuard'ın bazı garip konfigürasyonları" iyi, bu aslında böyle olabilir. Bunu hafta sonu kontrol edeceğim. şimdiye kadar teşekkürler, öğrendiğim herşeyi yorumlayacağım. – JacksOnF1re

+0

Bu yüzden yeni bir test projesi oluşturmaya başladım. Bir cihazda yüklendi, bazı bildirimlerde devre dışı bırakılmış takma ad olarak etkinleştirildi. Daha sonra test projesinin yeni bir sürümünü dağıttım ve "güncellemeyi" yükledim. Aslında takma ad devam ediyor. Ve nedenini bilmiyorum, diğer projemde, birden çok kez gittiler. Sorunu bulmaya çalışacağım ama cevabın kabul edilmeli. – JacksOnF1re

1

Kullanıcınızın SharedPreferences'ta seçtiği seçenekleri kaydedin ve güncellemeden sonra bunları yeniden uygulayın. Bunun için save in preferences the version number da olabilir, böylece bunun ne zaman uygulanması gerektiğini öğrenebilirsiniz.

this yanıtında da gördüğünüz gibi, bu tercihlerin uygulama güncellemesinde tutulduğunu, bu nedenle sorununuz için bir çözüm sağladığını söylemek güvenlidir. XML formatı böyle bir şey (

/data/system/user/0/package-restrictions.xml 

geçerli: etkin veya devre dışı bileşenlerin

+0

Bu benim için çalışmaz, çünkü güncelleme kullanıcı tarafından oluşturulan kısayolları kaldıracaktır. Ve onları manuel olarak yeniden ayarlamak ana ekrana dağılır, çünkü kısayolunuzun yerleştirileceği sırayı alamazsınız. Yine de teşekkürler. – JacksOnF1re

+0

Tamam, ne demek istediğini anladım. Bunu başka şekilde yaparsan işe yarar mı? varsayılan olarak true değerine ayarlayın ve kullanıcı tarafından etkinleştirilmediyse uygulama başladıktan sonra bunları kaldırın. Değil ideal bir deneyim olsa da ... – Mikel

+0

Maalesef, çünkü ilk yüklemeler uygulamayı başlatıncaya kadar tüm takma adları görecek ve kafanız karışacaktır. – JacksOnF1re

İlgili konular