2013-05-15 14 views
16

私は自分のアプリのためのアプリアップデータを書いています。私は、デバイス上で私のAPKを持っていることを確認した後に、これは私が更新しようとしているアプリの中から何をすべきかです:アンドロイドはプログラムによってapkをアップデートし、インストール結果を確認します

Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
File f = new File(apkLocation);  
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive"); 
_context.startActivity(promptInstall); 

これはアプリの権限を表示し、私はクリックすることができる午前私のインストーラを起動します"インストール"。しかし、ここからアプリは単に閉じて、私は何のメッセージも(私は "閉じる"または "開く"を押すためのオプションを与えるインストールが成功したと私に言ってダイアログを期待していた)。それはそれ以上の通知なしにデバイスのメイン画面に移動します。

私は手作業でそれを開いたときにアプリが実際に更新されています。 インストーラを期待どおりに進めるにはどうすればよいですか?意図には何か設定はありますか?

これを書いている間、私は、現在のアプリが単にデバイス上に上書きされ、ソースが終了したため意図の結果が得られない程度に上書きされるのかどうか疑問に思っていますか?

+5

おそらく罰金(Google Nowは、特にあなたがプレイストアからダウンロードしたアプリのためにこれを行うことができない彼らの契約条件に述べていることを考慮に入れる必要がありますがアマゾンなどで何かを考慮する) – jcw

+0

ありがとう、私はそれを知っていたSWでここでそれを読んでください。私の場合ではありません。 –

答えて

14

android.intent.action.PACKAGE_INSTALLまたはandroid.intent.action.PACKAGE_REPLACEDのようなインテントフィルタを使用してレシーバを登録すると、アプリケーションをもう一度やり直すことができます。

<receiver android:enabled="true" android:exported="true" android:label="BootService" android:name="com.project.services.BootService"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      <data android:scheme="package"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_ADDED"/> 
      <data android:scheme="package"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_INSTALL"/> 
      <data android:scheme="package"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_CHANGED"/> 
      <data android:scheme="package"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.PACKAGE_REPLACED"/> 
      <data android:scheme="package"/> 
     </intent-filter> 
    </receiver> 
</application> 

そして

public class BootService extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { 
     Intent serviceIntent = new Intent(); 
     serviceIntent.setClass(context,Controller.class); 
     serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(serviceIntent); 
    } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { 
     Intent serviceIntent = new Intent(); 
     serviceIntent.setClass(context, Controller.class); 
     serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(serviceIntent); 
    } 
    } 
} 
+0

これは動作していることを確認しましたか? – 323go

+4

私はそれを試して、それは完全に動作します。 if(context.getApplicationInfo()。packageName.equals((intent.getData())を追加しました。getSchemeSpecificPart())) '私は正しい放送を捕らえたことを確認します。それがなければ、私のアプリは店内でアプリのアップデートを実行した後に始まります。 –

+0

うれしいことを聞いて – Bishwash

1

まず、root権限を持っているか、システム権限を持っていない限り、プロンプトなしでインストールすることはできません。私はあなたがそれを求めているとは思わないが、あなたのパラグラフの一つは明確ではない。

第2に、実行中のアプリのアップデート版をインストールすると、次のような動作が予想されます。アプリが強制終了されて更新されています。インプレースで更新することはできません。インストーラを呼び出すアクティビティが再開されるため、インストールが中止されたときを検出できます。

実行中のアプリを更新して実行し続けるには、インストールを監視してアプリを再起動する別のプロセス(アプリ)が必要です。

+0

ええ、私の質問を定式化している間に、私の考えたように、そのような答えは私の質問になります。私はアクティビティのライフサイクルについて読んできましたが、この動作の正確な言及を見つけることができませんでしたが、アプリで殺されるのが理にかなっています。私の選択肢は何ですか?私は私の最初のアプリとは異なる範囲からインストール活動を開始する必要があると思っています。どのように私はこれを行うことができるかに関する任意のアイデア? –

+0

私はちょうど@Bishwashsのコードを試して、それは素晴らしいですので、実際にはPACKAGE_REPLACEDブロードキャストを受信することが可能だと思っています。ご協力いただきありがとうございます。 –

+0

良いことですが、それは素晴らしいニュースです。 – 323go

2

に成功あなたはURIを新しいタスクとして、あなたの更新アプリに示すと意図を起動する必要が更新します。

final Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)); 
"application/vnd.android.package-archive"); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

下記の私のポスト:

Android application update issue