【问题标题】:Android Widget developmentAndroid 小部件开发
【发布时间】:2013-07-11 22:14:46
【问题描述】:

我对 Android 开发还很陌生。

我有一个应用程序每秒从 USB 读取到串行连接。然后应用程序使用新数据更新 MainActivity 的 UI。我的应用程序还有一个小部件,它也使用新数据进行了更新。这很好用,但是当调用 onDestroy() 方法时,小部件停止工作。

我见过几个应用程序,即使该应用程序从未启动,小部件仍能继续工作和更新。至少据我所知不是。

这是怎么做到的?我希望我的小部件在没有应用程序运行的情况下运行和运行。这可能吗?

更新:

这是我的 MainActivity 的 onCreate() 中的一个 sn-p

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final HandlerThread hTh = new HandlerThread("HT");
    hTh.start();
    final long oneScd = 1000;
    final Handler handler = new Handler(hTh.getLooper());
    Runnable updateDisplay = new Runnable(){
        @Override
        public void run() {
            updateDisplay(GlobalSpeed._json);
        }
    };

    Runnable eachSec = new Runnable() {
        @Override
        public void run() {

            runOnUiThread(updateDisplay);
            handler.postDelayed(this, oneScd);
        }
    };
    handler.postDelayed(eachSec, oneScd);

这是我的 AppWidgetProvider 代码:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[]      appWidgetIds) {
    try {
        updateWidgetContent(context, appWidgetManager);

    } catch (Exception e) {
        Log.e(DEBUG_TAG, "Failed", e);
    }
}

public void updateWidgetContent(final Context context, final AppWidgetManager appWidgetManager) {

Intent launchAppIntent = new Intent(context, SoleWidgetProvider.class);

service = PendingIntent.getActivity(context, 0, launchAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    hTh.start();
    final long oneScd = 4000;
    final Handler handler = new Handler(hTh.getLooper());

    Runnable eachSec = new Runnable(){
        @Override
        public void run() {

            String js;

            js = GlobalSpeed._json;

            RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.sole_widget_layout);
            remoteView.setTextViewText(R.id.wSpeed, js);//"Speed: " + String.valueOf(s.realSpeed())

            ComponentName componentName = new ComponentName(context, SoleWidgetProvider.class);

            appWidgetManager.updateAppWidget(componentName, remoteView);

            handler.postDelayed(this, oneScd);
        }
    };
    handler.postDelayed(eachSec, oneScd);
}

这是我的服务,它从串行通信中获取响应并设置 GlobalSpeed._json 值。

public class WidgetUpdateService extends Service {
public static final String DEBUG_TAG = "SoleWidgetService";

public static String json;

private SerialComunicator serComm;
private Context context;

@Override
public void onStart(Intent intent, int startId){
    super.onStart(intent, startId);
    Log.d(DEBUG_TAG, "Sevice Started");
    serComm = new SerialComunicator(this);

    buildUpdate();
}


private void buildUpdate(){
    HandlerThread hTh = new HandlerThread("SHT");
    final long oneScd = 4000;
    hTh.start();
    final Handler handler = new Handler(hTh.getLooper());

    Runnable readSerial = new Runnable(){

        @Override
        public void run() {
            // TODO Auto-generated method stub

            GlobalSpeed._json = serComm.readDataFromSerial();

            handler.postDelayed(this, oneScd);
        }

    };
    handler.postDelayed(readSerial, oneScd);
}

public void displayToast(String msg){
    Toast.makeText(this, serComm.readDataFromSerial(), Toast.LENGTH_SHORT);
}



@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

}

希望这是足够的代码。

这一切都很好,当我转到主屏幕并调用应用程序的 onStop() 方法时,它可以正常工作,并且小部件会继续更新。但是当我从最近的应用程序中删除应用程序并且调用 onDestroy() 方法时,小部件停止更新。

我希望小部件能够独立于应用程序运行。我这可能吗?我知道一些似乎独立于他们的应用程序运行的小部件。

【问题讨论】:

  • 请贴一些代码说明问题...如果您需要答案...
  • 我希望这就足够了。

标签: android android-widget activity-lifecycle


【解决方案1】:

您需要编写一个在后台运行的服务,然后通过一个意图更新小部件(以及应用程序)。

在 android 中,当应用不在前台时,它会暂停,因此任何正在运行的代码也会暂停。

服务独立于应用程序。阅读有关服务的信息。您可以让它在启动时启动,或者让小部件在需要数据时触发服务。

但要考虑的一件事是每秒更新一次数据会耗尽电池电量。小部件通常旨在偶尔更新数据(每 30 分钟、每小时等),而不是每秒。

【讨论】:

  • 感谢您的意见。该设备将嵌入跑步机中,功耗不是问题。当用户在机器上运行时,它需要实时更新
  • 好的。然后一定要研究一项服务。让它在启动时启动,当它获得数据更新时,通过意图发送它们。然后,您的应用和小部件将注册这些意图,并接收数据更新:)
  • 我确实有一个正在运行的服务。我用代码更新了我的帖子,所以你可以看到。通过意图更新应用程序和小部件并没有引起我的注意。我会调查的。谢谢
  • 这可能是一个愚蠢的问题,但如果应用程序被暂停,那么它的小部件被暂停是有道理的,这是真的吗?如果是这样,我是否为没有活动的小部件创建一个单独的应用程序并使用 IPC 从服务中获取意图?或者将小部件保留在同一个应用程序中是否有效?
  • 应用暂停时小部件不会暂停。它与应用程序有单独的生命周期。
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2011-06-22
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多