Saturday, December 29, 2018

Chạy ứng dụng liên tục trên màn hình chính.


Nếu ta có một ứng dụng cần hiển thị liên tục trên màn hình chính, ta cần kiểm tra để nếu vì lý do nào đó nó bị chuyển vào background, như người dùng ấn nút home chẳng hạn, thì ta lại đưa nó ra. 
Tạo một service như sau.
public class newse extends Service {
 private static final int INTERVAL = 3000; // poll every 3 secs
 private static final String YOUR_APP_PACKAGE_NAME = "com.example.vidu";
 private static boolean stopTask;
private PowerManager.WakeLock mWakeLock;
 @Override
 public void onCreate() {
     super.onCreate();
  stopTask = false;
final ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
        // Start your (polling) task
    TimerTask task = new TimerTask() {
     @Override
     public void run() {
         // If you wish to stop the task/polling
     if (stopTask){
       this.cancel();
     }
List<ActivityManager.RunningAppProcessInfo> tasks = activityManager.getRunningAppProcesses();
String foregroundTaskPackageName = tasks.get(0).processName;
// Check foreground app: If it is not in the foreground... bring it!
if (!foregroundTaskPackageName.equals(YOUR_APP_PACKAGE_NAME)) {
Intent LaunchIntent = getPackageManager()
                          .getLaunchIntentForPackage(YOUR_APP_PACKAGE_NAME);
                 startActivity(LaunchIntent);
             }
            }
        };
  Timer timer = new Timer();
   timer.scheduleAtFixedRate(task, 0, INTERVAL);
    }
    @Override
    public void onDestroy(){
        stopTask = true;
        if (mWakeLock != null)
            mWakeLock.release();
        super.onDestroy();
    }
    @Override
    public IBinder onBind(Intent intent) {
         // TODO Auto-generated method stub
         return null;
    }
}
Chú ý String package phải đúng như gói ứng dụng của bạn.Khai báo service vào trong file AndroidManifest.xml, trên dòng </application> cuối cùng.
<service
android:name=".newse"
android:enabled="true"
android:exported="false"/>
Tại class cần duy trì hiển thị, thêm các dòng sau lên trên ngoặc đóng dưới cùng.
@Override
    public void onWindowFocusChanged(boolean hasFocus) {
         super.onWindowFocusChanged(hasFocus);
         if (!hasFocus) {
    Intent intent = new Intent(this, newse.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startService(intent);          }
         }
    }

Tức là mỗi khi ứng dụng bị ra khỏi màn hình chính, ta lập tức đưa nó trở lại. Sau khi chạy trở lại xong, nếu ta không tắt service, điện thoại sẽ bị hao pin rất nhanh vì service sẽ liên tục kiểm tra cứ 3 giây một lần xem ứng dụng có trên top hay không.Vậy ta sẽ tắt đi sau khi dùng xong.
Intent intent = new Intent(this, newse.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
       stopService(intent);
Có thể chỉ cần thêm dòng stopService là được, có khi phải tạo hàm để gọi.Tùy lúc dùng bạn thấy lúc nào cần gọi thì gọi, nói chung cần canh 3 nút back, home và menu là được. Cũng có thể chỉ dùng đoạn code trong lõi service.
  final ActivityManager activityManager=(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = activityManager.getRunningAppProcesses();
String foregroundTaskPackageName = tasks.get(0).processName;
 if(!foregroundTaskPackageName.equals(YOUR_APP_PACKAGE_NAME)) {
Intent LaunchIntent = getPackageManager()
.getLaunchIntentForPackage(YOUR_APP_PACKAGE_NAME);
startActivity(LaunchIntent);
}
Tuy nhiên khi dùng trực tiếp thế này nhiều khi nó không chạy!

No comments:

Post a Comment