2013-08-16 60 views
12

Tôi đang tìm cách giữ ứng dụng Android của mình chạy ở nền trước.Làm cách nào để giữ cho ứng dụng nền trước hoạt động 24/7?

Nó sẽ là một ứng dụng phân tán tư nhân, vì vậy tôi có thể làm bất cứ điều gì có thể để đảm bảo nó chạy liên tục trên thiết bị (HDMI TV Stick)

Vì vậy, làm thế nào tôi có thể chắc chắn rằng ứng dụng sẽ luôn chạy không vấn đề gì? Ứng dụng này có trọng lượng khá nhẹ về mặt sử dụng tài nguyên, vì vậy việc chạy ứng dụng 24/7 sẽ không phải là vấn đề.

Tôi đã đọc về thông số liên tục trong tệp kê khai, nhưng có vẻ như nó chỉ có thể áp dụng cho các ứng dụng hệ thống?

Tôi có nên đặt ứng dụng của mình thành ứng dụng hệ thống không? Làm thế nào tôi sẽ làm điều đó và nó sẽ giúp đỡ?

+0

Tôi tin rằng bạn chỉ có thể làm cho bạn app một ứng dụng hệ thống nếu thiết bị được cắm rễ. Bạn có thể muốn xem xét việc thay thế màn hình chính cho ứng dụng của mình, như ứng dụng chế độ kiosk. Xem câu trả lời của tôi [ở đây] (http://stackoverflow.com/questions/16657300/disable-all-home-button-and-task-bar-features-on-nexus-7/16657359#16657359). – TronicZomB

Trả lời

1

sử dụng này:

import android.os.PowerManager; 

public class MyActivity extends Activity { 

    protected PowerManager.WakeLock mWakeLock; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(final Bundle icicle) { 
     setContentView(R.layout.main); 

     /* This code together with the one in onDestroy() 
     * will make the screen be always on until this Activity gets destroyed. */ 
     final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 
     this.mWakeLock.acquire(); 
    } 

    @Override 
    public void onDestroy() { 
     this.mWakeLock.release(); 
     super.onDestroy(); 
    } 
} 

Và trong biểu hiện:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

Nhìn ở đây: How do I keep the screen on in my App?

+1

Đây không phải là những gì OP được sau. Anh ấy muốn giữ cho ứng dụng của mình chạy vĩnh viễn, điều này sẽ chỉ giữ màn hình bật trong khi ứng dụng của anh ấy đang chạy nhưng người dùng thiết bị sẽ có thể truy cập các ứng dụng khác – Boardy

+0

Nhưng một khi ứng dụng chạy, nó sẽ chạy chính xác không ngừng? Nếu không, nó có thể là một tùy chọn để xử lý OnDestroy và một số BroadcastReceivers để khởi động ứng dụng nếu nó không ở nền trước. – Thkru

+0

Sẽ không có gì ngăn người dùng mặc dù nhấn nút trang chủ và sau đó sử dụng các ứng dụng khác có thể được cài đặt trên thiết bị, do đó đặt ứng dụng OP vào nền. – Boardy

2

Đây là một cái gì đó không phải là quá dễ dàng để đạt được như các ứng dụng foreground được về mặt kỹ thuật không được phép chạy không ngừng. Ngoài ra nếu android đang hết bộ nhớ, nó sẽ bắt đầu giết chết các ứng dụng gây ra rủi ro ít nhất mà sau đó sẽ yêu cầu ứng dụng được khởi động lại bởi người dùng.

Như đã đề cập, bạn có thể biến nó thành ứng dụng hệ thống, nhưng tôi nghĩ bạn cần phải root thiết bị hoặc tạo ROM của riêng bạn và tạo một phần ứng dụng của ROM. Có lẽ không phải là giải pháp tốt nhất cho nhu cầu của bạn mặc dù ít người có thể flash ROM trên thiết bị của họ.

Tôi nghĩ giải pháp dễ nhất sẽ là đưa vào tệp kê khai rằng ứng dụng của bạn là thay thế màn hình chính, tức là ứng dụng trình khởi chạy. Tôi không biết mã chính xác từ đầu của tôi nhưng điều này sẽ đi vào phần ứng dụng trong tệp kê khai android. Điều này có nghĩa là ngay sau khi thiết bị khởi động hoặc người dùng nhấn nút trang chủ, họ sẽ được đưa đến ứng dụng của bạn.

+1

Điều mà OP cũng có thể muốn lưu ý là có khả năng có vấn đề (tôi đã làm ít nhất) sau khi khởi động với một tùy chỉnh thay thế nhà. [Đây là những gì tôi có kinh nghiệm và làm thế nào tôi cố định nó.] (Http://stackoverflow.com/questions/17372781/home-launcher-issue-with-fragments-after-reboot) – TronicZomB

12
  • Nếu bạn muốn một sử dụng ứng dụng bên ngoài: Autostart and StaY!

  • Nếu bạn muốn làm điều này theo chương trình bạn có thể sử dụng một dịch vụ mà các cuộc thăm dò mỗi "x" mili giây để xem nếu ứng dụng của bạn là ở mặt trước. Nếu không, nó sẽ bắt đầu/đưa ứng dụng của bạn vào nền trước. Làm điều đó như thế này:

    public class PersistService extends Service { 
    
        private static final int INTERVAL = 3000; // poll every 3 secs 
        private static final string YOUR_APP_PACKAGE_NAME = "YOUR_APP_PACKAGE_NAME"; 
    
        private static boolean stopTask; 
        private PowerManager.WakeLock mWakeLock; 
    
        @Override 
        public void onCreate() { 
         super.onCreate(); 
    
         stopTask = false; 
    
         // Optional: Screen Always On Mode! 
         // Screen will never switch off this way 
         mWakeLock = null; 
         if (settings.pmode_scrn_on){ 
          PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
          mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "a_tag"); 
          mWakeLock.acquire(); 
         } 
    
         // Start your (polling) task 
         TimerTask task = new TimerTask() { 
          @Override 
          public void run() { 
    
           // If you wish to stop the task/polling 
           if (stopTask){ 
            this.cancel(); 
           } 
    
           // The first in the list of RunningTasks is always the foreground task. 
           RunningTaskInfo foregroundTaskInfo = activityManager.getRunningTasks(1).get(0); 
           String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName(); 
    
           // 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(); 
        } 
    } 
    

Đoạn mã trên cũng có "tùy chọn" để buộc các màn hình để ở lại luôn trên!Tất nhiên, bạn sẽ cần các điều khoản sau đây:

<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

và không còn quên để đăng ký dịch vụ của bạn:

<service android:name="YOURPACAKGE.PersistService" 
    android:enabled="true"/> 
+0

Câu trả lời hay, vì vậy cách này sẽ giữ ứng dụng chạy ngay cả khi nó ẩn (một ứng dụng khác đang mở)? – Dania

+1

Thx. Nếu nó không chạy ở tất cả hoặc chạy trong nền, nó sẽ khôi phục lại nó, tức là mang nó đến nền trước. – Tanasis

+0

Câu trả lời hay, NHƯNG: vấn đề duy nhất tôi gặp phải là khi nhận được thông báo qua email, ví dụ: tôi có thể chọn email và ứng dụng sẽ nhận được ứng dụng tiền cảnh. Làm thế nào tôi vô hiệu hóa nó? – Meir

0

Bạn có thể làm cho ứng dụng của bạn trở thành một bệ phóng, bằng cách thêm 2 thẻ loại sau vào <intent-filter> tags:

<category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.HOME"/> 

thì bạn nên luôn kiểm tra xem có ứng dụng khác chạy trên đầu, chạy mã sau để hướng người dùng đến ứng dụng của chúng tôi:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 

Tôi đã thử giải pháp này nhưng không thể ẩn các ứng dụng vẽ lên trên, như đầu trò chuyện trên Facebook Messenger.

0

Tôi đã giải quyết vấn đề đó bằng cách chạy dịch vụ dính để khởi chạy lại ứng dụng khi hoạt động bị đóng.

//Your activity 

@Override 
public void onPause() { 
    super.onPause(); 

    if (yourservice != null) { 
     yourservice.validateActivityOnPause(); 
    } 
} 

và trong validateActivityOnPause() có cái gì đó như:

//Your service 

public void validateLynxActivityOnPause() { 
    //Do some stuff here 

    Intent startActivityIntent = new Intent(this, LynxActivity.class); 
    startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    this.startActivity(startActivityIntent); 
} 
Các vấn đề liên quan