public class ApplicationInstaller extends Activity {
private final static int createState = 1, installState = 2;
private int activityState = 0, counter = 0;
private ApplicationInstallerReceiver aIR;
private String appName, appPath;
private boolean result;
//---------------------------------------------------------------------------------------------
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_installer);
if (activityState == 0) {
this.activityState = ApplicationInstaller.createState;
this.appName = this.getIntent().getStringExtra("AppName");
this.appPath = this.getIntent().getStringExtra("AppPath");
if (this.appName == null || this.appPath == null) {
finish();
}
}
}
//---------------------------------------------------------------------------------------------
@Override
public void onStart() {
super.onStart();
if (this.activityState == ApplicationInstaller.createState) {
activityState = ApplicationInstaller.installState;
aIR = new ApplicationInstallerReceiver();
IntentFilter ifilter = new IntentFilter();
ifilter.addAction(Intent.ACTION_PACKAGE_ADDED);
ifilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
ifilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
ifilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
ifilter.addDataScheme("package");
registerReceiver(aIR, ifilter);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(appPath)), "application/vnd.android.package-archive");
try {
startActivity(intent);
} catch (Exception e) {
result = false;
finish();
}
} else {
finish();
}
}
//---------------------------------------------------------------------------------------------
@Override
protected void onResume() {
super.onResume();
counter++;
if (counter == 2) {
finish();
}
}
//---------------------------------------------------------------------------------------------
@Override
protected void onDestroy() {
super.onDestroy();
if (aIR != null) {
this.unregisterReceiver(aIR);
}
if (activityState == installState) {
Intent intent = new Intent(DeviceSoftWareManager.installerAction);
intent.putExtra("Result", this.result);
sendBroadcast(intent);
}
}
//---------------------------------------------------------------------------------------------
class ApplicationInstallerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
result = true;
ApplicationInstaller.this.finish();
}
}
}
If a user chooses "Install" Intent.ACTION_PACKAGE...
actions will be generated.
If a user chooses "Don't install" an activity quits without Intent.ACTION_PACKAGE...
actions.
That means "User has canceled an installation".