بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
بسته شدن خودکار برنامه بعد از مدتی که در background می مونه
سلام دوستان از عنوان که مشخصه این سوال را قبلا دوست خوبمون کریس پرسیده بودن من هم کدی را قرار دادم اما مشکلی هست که نیاز به روت داره و در اندروید های 4.2 و 4.4 و 5 عملکردی متفاوت داره و راه حل اساسی نیست.
می خوام برنامه به صورت کامل بسته بشه چون در کلاس Gمتغییرهایی وجود داره که با باز شدن مجدد برنامه گاهی اوقات هیچ اطلاعاتی از اکتیویتی جاری نشون نمیده
AndroidManifest
<activity
android:name=".ActivitySettings"
android:autoRemoveFromRecents="true"
android:excludeFromRecents="true"
android:label="@string/app_name" >
</activity>
ActivityEnhanced
package ir.na9vi;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
import my_class.FontHelper;
import my_class.G;
import android.Manifest;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.ViewGroup;
public class ActivityEnhanced extends Activity {
private long time = 5000;
private static final int WRITE_PERMISSION = 0x01;
private static int SECTION_COUNT;
private static String[] PERMISSIONS_SDCARD = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.WAKE_LOCK,
Manifest.permission.CHANGE_NETWORK_STATE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.KILL_BACKGROUND_PROCESSES,
Manifest.permission.GET_TASKS
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
G.CurrentActivity = this;
appisrun();
checkperemition();
try {
listTasks();
} catch (NameNotFoundException e) {
Log.e(G.APP_LOG, "list task NameNotFoundException");
}
}
private void checkperemition() {
// TODO Auto-generated method stub
}
private void listTasks() throws PackageManager.NameNotFoundException {
if (Build.VERSION.SDK_INT >= 21) {
try {
ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.AppTask> tasks = mgr.getAppTasks();
String packagename;
String label;
for (ActivityManager.AppTask task : tasks) {
packagename = task.getTaskInfo().baseIntent.getComponent()
.getPackageName();
label = getPackageManager().getApplicationLabel(
getPackageManager().getApplicationInfo(packagename,
PackageManager.GET_META_DATA)).toString();
Log.v(G.APP_LOG, packagename + ":" + label
+ " SDK_INT >= 21");
}
} catch (NoSuchMethodError e) {
Log.e(G.APP_LOG, "getAppTasks not found");
}
} else {
ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> tasks = mgr.getRecentTasks(20,
0);
String Packagename;
String Label;
for (ActivityManager.RecentTaskInfo task : tasks) {
Packagename = task.baseIntent.getComponent().getPackageName();
Label = getPackageManager().getApplicationLabel(
getPackageManager().getApplicationInfo(Packagename,
PackageManager.GET_META_DATA)).toString();
Log.e(G.APP_LOG, Packagename + ":" + Label + " SDK_INT < 21");
}
}
}
private void appisrun() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (isApplicationSentToBackground(G.context)) {
try {
killBackgroundProcesses(getApplicationContext());
// kill_process();
} catch (Exception e) {
Log.e(G.APP_LOG, "killBackgroundProcesses Exception");
}
}
}
}, time);
}
protected void killBackgroundProcesses(final Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.killBackgroundProcesses(G.PACKAGE_NAME);
System.exit(0);
android.os.Process.killProcess(android.os.Process.myPid());
Log.i(G.APP_LOG, "delete app 3");
}
public static boolean isApplicationSentToBackground(final Context context) {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
if (!tasks.isEmpty()) {
for (int i = 0; i < tasks.size(); i++) {
ComponentName topActivity = tasks.get(i).topActivity;
if (!topActivity.getPackageName().equals(
context.getPackageName())) {
Log.i(G.APP_LOG, "isApplicationSentToBackground");
return true;
}
}
}
return false;
}
protected void kill_process() {
try {
Process suProcess = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(
suProcess.getOutputStream());
os.writeBytes("adb shell" + "\n");
os.flush();
os.writeBytes("am force-stop " + G.PACKAGE_NAME + " \n");
os.flush();
Log.i(G.APP_LOG, "delete app 2");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onPause() {
super.onPause();
appisrun();
}
@Override
protected void onStop() {
super.onStop();
appisrun();
}
@Override
protected void onResume() {
super.onResume();
G.CurrentActivity = this;
appisrun();
try {
FontHelper.persianizer((ViewGroup) getWindow().getDecorView());
} catch (Exception e) {
Log.i(G.APP_LOG, "Error in set font");
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Intent intent = new Intent("PERMISSION_RECEIVER");
intent.putExtra("requestCode", requestCode);
intent.putExtra("permissions", permissions);
intent.putExtra("grantResults", grantResults);
sendBroadcast(intent);
}
}
برای این سوال پاسخی وجود ندارد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .