آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

بسته شدن خودکار برنامه بعد از مدتی که در background می مونه

احمد  9 سال پیش  9 سال پیش
0 0

سلام دوستان از عنوان که مشخصه این سوال را قبلا دوست خوبمون کریس پرسیده بودن من هم کدی را قرار دادم اما مشکلی هست که نیاز به روت داره و در اندروید های 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);
	}

}

 

 

 برای این سوال پاسخی وجود ندارد.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .