嚴正聲明
本人本著技術開放,思想分享的目的,撰寫本文。文章僅供參考之用,請勿使之於非法或有害於社會和諧之用。
Sodino
2011-01-24
Android上能不能實現卸載時提示呢,比如卸載某某軟體時,做個使用者調查卸載的原因。
我以前想著是的不行的,以前的想法是:
Windows上卸載時能實現此功能是因為有些程式的卸載是自己實現的,非系統操作。
但android上目前來說還不支援,系統卸載時,還沒發現有啥介面可以和目標卸載程式互動。
呵呵,今天鼓搗LogCat,發現還是可以的。
實現基礎是:
1.通過註冊許可權,能夠擷取LogCat的輸出資料流的輸出資訊。
2.進入系統的卸載介面時,"打包安裝程式(com.android.packageinstaller)"會輸出如下資訊
01-22 16:29:15.250: INFO/ActivityManager(147): Starting activity: Intent { act=android.intent.action.DELETE dat=package:lab.sodino.uninstallhint cmp=com.android.packageinstaller/.UninstallerActivity }
好了,有這句話就足夠了。截取輸出資料流資訊,當擷取字串中包含"android.intent.action.DELETE"和"<you_package>"時,就啟動卸載提示頁面。
話就這麼多了。接下來看,上代碼。
package lab.sodino.uninstallhint;<br />import android.app.Activity;<br />import android.content.Intent;<br />import android.os.Bundle;<br />import android.os.Handler;<br />import android.os.Message;<br />import android.view.View;<br />import android.widget.Button;<br />import android.widget.TextView;<br />/**<br /> * @author Sodino E-mail:sodinoopen@hotmail.com<br /> * @version Time:2011-1-12 上午10:09:59<br /> */<br />public class MainActivity extends Activity implements LogcatObserver {<br />private TextView txtInfo;<br />private Handler handler;<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);<br />Button btnScannerLogcat = (Button) findViewById(R.id.btnScanLogcat);<br />btnScannerLogcat.setOnClickListener(new Button.OnClickListener() {<br />public void onClick(View view) {<br />// 開啟Logcat流監聽<br />LogcatScanner.startScanLogcatInfo(MainActivity.this);<br />}<br />});<br />Button btnUninstallMe = (Button) findViewById(R.id.btnUninstallMe);<br />btnUninstallMe.setOnClickListener(new Button.OnClickListener() {<br />public void onClick(View view) {<br />// 調用應用程式資訊<br />Intent intent = new Intent(Intent.ACTION_VIEW);<br />// com.android.settings/.InstalledAppDetails<br />intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");<br />intent.putExtra("pkg", "lab.sodino.uninstallhint");<br />startActivity(intent);<br />}<br />});<br />txtInfo = (TextView) findViewById(R.id.txtInfo);<br />handler = new Handler() {<br />public void handleMessage(Message msg) {<br />txtInfo.append(String.valueOf(msg.obj) + "/n");<br />}<br />};<br />}<br />public void handleNewLine(String info) {<br />Message msg = new Message();<br />msg.obj = info;<br />handler.sendMessage(msg);<br />if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {<br />// 啟動刪除提示<br />Intent intent = new Intent();<br />intent.setClass(this, UninstallWarningActivity.class);<br />intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);<br />startActivity(intent);<br />}<br />}<br />}
package lab.sodino.uninstallhint;<br />import java.io.DataInputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />/**<br /> *@author Sodino Email:sodinoopen@hotmail<br/><br /> *@version 2011-1-22 上午11:10:56<br /> */<br />public class LogcatScanner {<br />private static AndroidLogcatScanner scannerThead;<br />public final static void startScanLogcatInfo(LogcatObserver observer) {<br />if (scannerThead == null) {<br />scannerThead = new AndroidLogcatScanner(observer);<br />scannerThead.start();<br />LogOut.out(LogcatScanner.class, "scannerThread.start()");<br />}<br />}<br />static class AndroidLogcatScanner extends Thread {<br />private LogcatObserver observer;<br />public AndroidLogcatScanner(LogcatObserver observer) {<br />this.observer = observer;<br />}<br />public void run() {<br />String[] cmds = { "logcat", "-c" };<br />String shellCmd = "logcat";<br />Process process = null;<br />InputStream is = null;<br />DataInputStream dis = null;<br />String line = "";<br />Runtime runtime = Runtime.getRuntime();<br />try {<br />observer.handleNewLine(line);<br />int waitValue;<br />waitValue = runtime.exec(cmds).waitFor();<br />observer.handleNewLine("waitValue=" + waitValue + "/n Has do Clear logcat cache.");<br />process = runtime.exec(shellCmd);<br />is = process.getInputStream();<br />dis = new DataInputStream(is);<br />while ((line = dis.readLine()) != null) {<br />observer.handleNewLine(line);<br />}<br />} catch (InterruptedException e) {<br />e.printStackTrace();<br />} catch (IOException ie) {<br />ie.printStackTrace();<br />} finally {<br />try {<br />if (dis != null) {<br />dis.close();<br />}<br />if (is != null) {<br />is.close();<br />}<br />if (process != null) {<br />process.destroy();<br />}<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}<br />}<br />}<br />}
package lab.sodino.uninstallhint;<br />/**<br /> * @author Sodino E-mail:sodinoopen@hotmail.com<br /> * @version Time:2011-1-22 下午03:00:54<br /> */<br />public interface LogcatObserver {<br />public void handleNewLine(String line);<br />}
package lab.sodino.uninstallhint;<br />import android.app.Activity;<br />import android.app.ActivityManager;<br />import android.content.Context;<br />import android.content.Intent;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.widget.Button;<br />/**<br /> * @author Sodino E-mail:sodinoopen@hotmail.com<br /> * @version Time:2011-1-12 上午10:26:09<br /> */<br />public class UninstallWarningActivity extends Activity {<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.uninstall_warning);<br />Button btnContinue = (Button) findViewById(R.id.btnContinue);<br />btnContinue.setOnClickListener(new Button.OnClickListener() {<br />public void onClick(View view) {<br />UninstallWarningActivity.this.finish();<br />}<br />});<br />Button btnCancel = (Button) findViewById(R.id.btnCancel);<br />btnCancel.setOnClickListener(new Button.OnClickListener() {<br />public void onClick(View view) {<br />UninstallWarningActivity.this.finish();<br />ActivityManager actMag = (ActivityManager) UninstallWarningActivity.this<br />.getSystemService(Context.ACTIVITY_SERVICE);<br />//殺掉系統的打包安裝程式。<br />if (android.os.Build.VERSION.SDK_INT < 8) {<br />actMag.restartPackage("com.android.packageinstaller");<br />} else {<br />actMag.killBackgroundProcesses("com.android.packageinstaller");<br />}<br />Intent i = new Intent(Intent.ACTION_MAIN);<br />i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);<br />i.addCategory(Intent.CATEGORY_HOME);<br />startActivity(i);<br />}<br />});<br />}<br />}
最後在AndroidManifest.xml中添加上許可權。
<uses-permission android:name="android.permission.READ_LOGS" /><br /><uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/><br /><uses-permission android:name="android.permission.RESTART_PACKAGES"/>
本文內容歸CSDN部落格博主Sodino
所有
轉載請註明出處:http://blog.csdn.net/sodino/archive/2011/01/22/6158659.aspx