继上次成功实现了多功能的服务选项卡应用后,我对于鸿蒙的Atomic Service系统有了更多的兴趣。于是,我决定继续深入探索这项技术,这次我选择了Atomic Service Web。它可以让我在鸿蒙应用中集成网页服务,为用户提供轻量级的浏览体验。这个功能的设计非常有意思,适合在本地原子化服务和网络资源之间搭建桥梁,比如通过网页快速展示一些内容而不需要本地开发太复杂的功能。

我这次独立开发的目标是构建一个能够展示新闻网页内容的应用,用户可以在选项卡中选择“新闻服务”并通过Atomic Service Web组件直接访问外部网页,以获取最新的新闻资讯。

初步构思与应用场景

在开发开始之前,我想象了一下这个功能在实际中的应用场景。很多时候,用户希望快速查看一些特定网页的信息,比如新闻、博客或者产品页面,而原生开发这些页面成本较高且不够灵活。因此,Atomic Service Web组件就非常适合这种需求,它可以在应用内部集成网页内容,为用户提供快速的浏览体验,并且无需跳转到浏览器应用。

环境搭建与基本实现

在鸿蒙的DevEco Studio中创建了一个新项目后,我首先在项目中定义了两个页面:一个是原子化服务页面,另一个是包含网页内容的页面。目标是让用户可以通过原子化服务导航到包含新闻网页的页面,并通过Atomic Service Web组件加载新闻内容。

首先,在config.json中定义了新闻服务的信息,确保服务可以被其他原子服务调用。

{
  "services": [
    {
      "name": "NewsServiceWeb",
      "description": "提供新闻网页浏览服务",
      "type": "atomic",
      "entry": "newsWebPage"
    }
  ]
}

使用Atomic Service Web实现网页集成

接下来,我开始编写新闻页面newsWebPage的代码,这个页面使用AtomicServiceWeb组件来加载网页内容。在这个页面中,我添加了一个简单的搜索框,用户可以输入关键词搜索相关新闻。

import atomicServiceWeb from '@ohos.atomicservice';

export default {
  data: {
    webSrc: 'https://news.example.com',
    searchKeyword: ''
  },
  onInit() {
    console.log('Atomic Service Web 初始化完成');
  },
  methods: {
    onSearch() {
      if (this.searchKeyword.trim()) {
        this.webSrc = `https://news.example.com/search?q=${encodeURIComponent(this.searchKeyword)}`;
        console.log('搜索关键词更新:', this.searchKeyword);
      }
    }
  }
}

在模板中,我使用了AtomicServiceWeb来加载网页,并且为用户提供了一个输入框和搜索按钮。

<template>
  <div class="container">
    <input type="text" v-model="searchKeyword" placeholder="输入关键词搜索新闻" />
    <button @click="onSearch">搜索</button>
    <atomic-service-web :src="webSrc" style="height: 500px; width: 100%;"></atomic-service-web>
  </div>
</template>

通过这样的实现,用户可以输入想要搜索的新闻关键词,并点击搜索按钮,网页内容会更新为与关键词相关的新闻列表。

整合到服务选项卡中

为了与上次实现的多功能选项卡应用集成,我在上次的项目中新增了一个选项卡,用于展示“新闻网页服务”。通过这个选项卡,用户可以直接访问新闻网页,无需切换到浏览器应用,体验更加统一。

在AtomicServiceTabs的选项卡数据中,我添加了新的“新闻网页服务”条目。

export default {
  data: {
    tabs: [
      { title: '天气', serviceName: 'WeatherService' },
      { title: '交通', serviceName: 'TrafficService' },
      { title: '新闻', serviceName: 'NewsService' },
      { title: '新闻网页', serviceName: 'NewsServiceWeb' }
    ],
    currentTabIndex: 0
  },
  methods: {
    onTabSelected(index) {
      this.currentTabIndex = index;
      atomicServiceTabs.navigateToTab({
        serviceName: this.tabs[index].serviceName
      }).then(() => {
        console.log(`成功切换到 ${this.tabs[index].title} 服务`);
      }).catch((error) => {
        console.error('切换失败:', error);
      });
    }
  }
}

在模板中,新增了对应的内容展示逻辑,当用户选择“新闻网页服务”选项卡时,页面会加载新闻网页。

<template>
  <div class="container">
    <atomic-service-tabs :tabs="tabs" @change="onTabSelected"></atomic-service-tabs>
    <div class="content">
      <div v-if="currentTabIndex === 0">
        <weather-page></weather-page>
      </div>
      <div v-if="currentTabIndex === 1">
        <traffic-page></traffic-page>
      </div>
      <div v-if="currentTabIndex === 2">
        <news-page></news-page>
      </div>
      <div v-if="currentTabIndex === 3">
        <news-web-page></news-web-page>
      </div>
    </div>
  </div>
</template>

挑战与优化

在开发过程中,我遇到了一个挑战,那就是网页加载速度的优化问题。通过Atomic Service Web加载外部网页时,网络状况可能会影响用户体验,特别是在网络较差的情况下,页面可能会加载较慢。为了优化这种情况,我决定增加一个加载提示,用户可以在页面加载时看到“加载中”的状态提示。

export default {
  data: {
    isLoading: true,
    webSrc: 'https://news.example.com',
    searchKeyword: ''
  },
  onInit() {
    console.log('Atomic Service Web 初始化完成');
  },
  methods: {
    onSearch() {
      if (this.searchKeyword.trim()) {
        this.isLoading = true;
        this.webSrc = `https://news.example.com/search?q=${encodeURIComponent(this.searchKeyword)}`;
        console.log('搜索关键词更新:', this.searchKeyword);
      }
    },
    onWebLoaded() {
      this.isLoading = false;
      console.log('网页加载完成');
    }
  }
}

在模板中,添加了加载提示的逻辑,并通过AtomicServiceWeb的onload事件来隐藏加载提示。

<template>
  <div class="container">
    <input type="text" v-model="searchKeyword" placeholder="输入关键词搜索新闻" />
    <button @click="onSearch">搜索</button>
    <div v-if="isLoading" class="loading">加载中...</div>
    <atomic-service-web :src="webSrc" @load="onWebLoaded" style="height: 500px; width: 100%;"></atomic-service-web>
  </div>
</template>

通过这样的改进,用户在网页加载时会看到“加载中”的提示,从而减少了因为等待而产生的不确定感,优化了整体的用户体验。

最终成品:一个包含网页服务的新闻浏览应用

经过一段时间的开发,我成功完成了这个网页服务浏览的应用。用户可以在多功能选项卡中选择“新闻网页服务”,并通过搜索框来查找自己感兴趣的新闻,网页内容会直接在应用内呈现。这次开发让我对鸿蒙的Atomic Service Web组件有了更多的了解,也让我意识到,网页与本地原子化服务的结合,可以为用户提供更加轻量和灵活的使用体验。

总结与思考:Atomic Service Web的价值

通过对Atomic Service Web的开发与实践,我深刻体会到了这个组件在快速集成外部网页内容中的价值。它能够在不增加本地开发复杂度的情况下,快速提供用户所需的内容,尤其适合那些内容更新频繁但又不需要深入交互的场景。在未来,我希望能够结合更多的数据接口,将网页内容与本地服务进一步整合,提供更加个性化的体验。

希望这次的分享能够为你在鸿蒙开发中的网页服务集成带来一些启发,也欢迎你们加入我的鸿蒙开发之旅,一起探索更多的可能性!


nshen
2.3k 声望242 粉丝