2014-11-30 11:54:23 camel_uestc 阅读数 297
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19663 人正在学习 去看看 任苹蜻
一、WorkSpace 的构成
WorkSpace

      WorkSpace是一个ViewGroup,用来显示应用图标,文件夹,widget

包含多个CellLayout:

    <include android:id="@+id/cell2" layout="@layout/workspace_screen" />

    <include android:id="@+id/cell3" layout="@layout/workspace_screen" />

     <include android:id="@+id/cell4" layout="@layout/workspace_screen" />

    <include android:id="@+id/cell5" layout="@layout/workspace_screen" />

当项目需要使用相同的布局时,使用Include标签可达到重用layout布局文件的作用
 

二、计算View大小(measure

measure过程的本质是把视图布局时使用的相对值转换为具体值的过程。
View系统启动measure过程是从ViewRoot中调用host.measure()开始的。
Host.measure()会调用View类的measure()函数,该函数被final修饰,不能被重载,该方法中回调onMeasure()。
自定义View大多时候重写onMeasure()时需要对计算控件的实际大小,然后调用setMeasuredDimension(int,int)设置实际大小。
onMeasure传入的widthMeasureSpecheightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED,MeasureSpec.EXACTLY,MeasureSpec.AT_MOST
MeasureSpec.EXACTLY是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView通过measure方法传入的模式。
最根儿的widthMeasureSpecheightMeasureSpec通过调用getRootMeasureSpec()获取的。
 

三、 布局过程(layout

1.执行完measure操作后,接下来就是layout过程了。

2.Layout函数的最初的调用从ViewRoot类的performTraversals()

3.Layout函数类型是final,子类不能重载,保证View系统中layout过程不变,在该函数中回调onLayout()

4.layout()函数内部流程如下:

       a. 调用setFrame()将位置参数保存到View内部变量(mLeft,mTop,mRight,mButtom).

       b. 回调onLayout(),View中定义的onLayout()函数默认什么都不做,ViewGroup中该方法重载修改为抽象方法,所以继承ViewGroup类必须重载onLayout,View系统希望在onLayout()中对该视图所包含的子视图进行layout操作

       c.清除mPrivateFlags中的LAYOUT_REQUIRED标识,layout操作已经完成了。

ViewGroup的切屏就是不断绘制的过程。
当手指在屏幕上滑动,通过调用ViewscrollBy()来更新屏幕
当手指离开屏幕,通过调用ScrollerstartScroll()来开始滚动切屏,在该函数中主要是进行赋值:水平方向滚动的偏移值,垂直方向滚动的偏移值水平方向滑动的距离,垂直方向滑动的距离,滚动持续时间
重载computeScroll()方法,在drawChild()方法中调用computeScroll()达到

自动滚动切屏的作用。

    以上过程的作用:1.计算mScrollX,mScrollY的值.2.通过invalidate函数来调用dispatchDraw()函数来不停的绘制。

dispatchdraw()中绘制父视图中包含的子视图,本质作用是给不同的子视图分配合适的canvas,如何绘制,则递归到view类的draw()函数。
dispatchDraw()内部执行流程:

          a.判断mGroupFlags是否设置FLAG_RUN_ANIMATION标识,该标识是ViewGroup的布局动画标识。

       b.处理padding属性。

          c.清除mPrivateFlagsDRAW_ANIMATION标识,因为接下来会绘制视图了。

          d.使用for()循环,针对子视图逐个调用drawChild()函数.

          e.重新检查mGroupFlags是否包含FLAG_INVALIDATED_REQURIED标识,因为drawChild()调用后,可能需要重绘ViewGroup.

           f.与第一步对称,如果第一步处理了布局动画,通知应用程序布局动画完成.

drawChild()的核心过程是为子视图分配合适的Canvas剪切区.根据之前步奏计算得到的mScrollX,mScrollY的值,通过调用canvas. translate()函数来移动画布,达到视图滚动的效果。
 

四、WorkSapce 切屏 && 特效

drawChild()中通过调用getChildStaticTransformation ()方法来绘制切屏的特效。
getChildStaticTransformation(View child, Transformationtransformation)中通过transformation来获取canvasmatrix,通过调用matrix.setPolyToPoly()函数来控制canvas的变换,同时调用

      transformation.setAlpha()方法来控制透明度的变化。

    public void SetPolyToPoly (float[]srcint srcIndex, float[]dstint dstIndexint pointCount)

       功能:多边形的转换

      src:原始区域

      dst:目标区域

      pointCount:区域总的顶点数目

      比如说需要把一个矩形区域的内容搬到另一个矩形区域,一个继续有4个顶点,每个顶点需要xy来标识,这样srcdst数组的长度都是8,分别代表了 左上,右上,右下,左下顶点的坐标值。

一定要调用setStaticTransformationsEnabled( true ) ,才使getChildStaticTransformation()生效.
 

五、主题包的制作和使用

1.主题包是什么

       主题包其实就是一个包含了相同主题的文件资源(主要是图片)的应用程序.

2.如何制作主题包

        遵循自己定义的一系列规则,比如图片的命名,该主题包的action设置等,然后打包成一个apk文件.

3. 如何获取安装的主题

        手机已经安装了应用的主题包,在程序中通过PackageManagerqueryIntentActivities函数来获取符合规则的主题包.比如在LauncherEyyo中通过下面的代码来获取主题包.

1.获取了安装的主题包,并选择其中的一个主题包,通过调用android.os.Process.killProcess(android.os.Process.myPid())来重启该应用,重新加载资源.

2.在程序中通过调用PackageManagergetResourcesForApplication ()来获取该主题包的Resources .

3.得到该主题包的Resources,通过调用该ResourcesgetIdentifier ()函数来获取指定文件名的资源.

       getIdentifier(“textView01”, “id”, “cn.xxx.xxx”); 
      
第一个参数为应用需要替换的文件名,第二个为资源属性是ID或者是Drawable,第三个为包名。返回值是该文件的id,如果返回值为0,则说明该主题包中没有包含对应的文件. 

 

2014-05-04 17:06:30 tianxiagongzheng 阅读数 2369
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19663 人正在学习 去看看 任苹蜻

开发自己的android桌面,有这个想法是去年一个项目(移动公司的变态项目,需要定制android机器,将一对移动业务定制到里面去)需要定制android桌面,当初的做法是直接改原版的Launcher.apk源码,然后再Linux下编译生成Launcher.apk然后刷到固件中去.实现桌面定制,让用户无法删除.

废话不多说了.我们现在要做的不是改原生的Launcher.apk,而是做个相当于普通apk能删除与安装的桌面,现在市面上有的如:91的熊猫桌面.还有其他一些在开发的就不多说了.
先什么都不说来段demo最实际,一切从最原始的兴趣驱动,有了小成就才更有动力来了解与学习launcher,需要刨根问底的同学们,自己google先.

Manager.java

Html代码
  1. package com.jaryou; 
  2.  
  3. import com.nebulalauncher.R; 
  4.  
  5. import android.app.Activity; 
  6. import android.os.Bundle; 
  7.  
  8. public class Manager extends Activity { 
  9.     /** Called when the activity is first created. */ 
  10.     @Override 
  11.     public void onCreate(Bundle savedInstanceState) { 
  12.         super.onCreate(savedInstanceState); 
  13.         setContentView(R.layout.main); 
  14.     } 

Launcher.java

Java代码
  1. package com.jaryou.launcher; 
  2.  
  3. import com.nebulalauncher.R; 
  4.  
  5. import android.app.Activity; 
  6. import android.os.Bundle; 
  7.  
  8. public class Launcher extends Activity{ 
  9.     /** Called when the activity is first created. */ 
  10.     @Override 
  11.     public void onCreate(Bundle savedInstanceState) { 
  12.         super.onCreate(savedInstanceState); 
  13.         setContentView(R.layout.launcher); 
  14.     } 

launcher.xml

Html代码
  1. <?xml version="1.0"encoding="utf-8"?> 
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7. <TextView   
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content"  
  10.     android:text="@string/hello" 
  11.     /> 
  12. </LinearLayout> 

main.xml

Html代码
  1. <?xml version="1.0"encoding="utf-8"?> 
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     > 
  7. <TextView   
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content"  
  10.     android:text="@string/hello" 
  11.     /> 
  12. </LinearLayout> 
AndroidManifest.xml   (关键代码)
Html代码
  1. <?xml version="1.0"encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.nebulalauncher"android:versionCode="1" 
  4.     android:versionName="1.0"> 
  5.     <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> 
  6. <!-- 作为桌面设置的Activity --> 
  7.         <activityandroid:name=".Manager"android:label="@string/app_name"> 
  8.             <intent-filter> 
  9.                 <actionandroid:name="android.intent.action.MAIN"/> 
  10.                 <categoryandroid:name="android.intent.category.LAUNCHER"/> 
  11.             </intent-filter> 
  12.         </activity> 
  13.         <!--  作为桌面Activity --> 
  14.         <activityandroid:name="com.jaryou.launcher.Launcher"> 
  15.             <intent-filter>  
  16.                 <actionandroid:name="android.intent.action.MAIN"/>  
  17.                 <!-- 关键部分 开始--> 
  18.                 <categoryandroid:name="android.intent.category.HOME"/>  
  19.                 <categoryandroid:name="android.intent.category.DEFAULT"/> 
  20.                 <!-- 关键部分 结束-->  
  21.             </intent-filter>  
  22.         </activity>        
  23.     </application> 
  24.     <uses-permissionandroid:name="android.permission.CALL_PHONE"/> 
  25.     <uses-permissionandroid:name="android.permission.EXPAND_STATUS_BAR"/> 
  26.     <uses-permissionandroid:name="android.permission.GET_TASKS"/> 
  27.     <uses-permissionandroid:name="android.permission.READ_CONTACTS"/> 
  28.     <uses-permissionandroid:name="android.permission.SET_WALLPAPER"/> 
  29.     <uses-permissionandroid:name="android.permission.SET_WALLPAPER_HINTS"/> 
  30.     <uses-permissionandroid:name="android.permission.VIBRATE"/> 
  31.     <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/> 
  32. </manifest> 


新建个android的项目,将上面的代码贴进去,然后运行.

ok,然后再长按  挂机键 出现桌面选择提示

1.启动器(默认launcher)

2. 你的应用名称

这时候选择你的应用,会发现桌面变成了你的刚弄的这个demo了.

如果需要变回原来的launcher.只需要要长按挂机键然后松开就能换回默认桌面.

不多说了.先去体现下吧.

2016-11-25 21:40:41 linzhihan7410 阅读数 280
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19663 人正在学习 去看看 任苹蜻

实现定制桌面:
在App的主MainActivity里面获取系统所有App并且使用GridView显示出来

创建Android项目 5.1系统 项目名为:AndroidCusyomDesktopDemo

XML文件:
一.在MainActivity(使用线性布局,纵向)里创建一个GridView控件

< GridView
        android:id="@+id/gv_mainshow"
        android:numColumns="4"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

二.创建item界面,在里面添加一个ImageView以及TextView:
< ImageView
android:id=”@+id/gridiv_image_item”
android:layout_width=”100dp”
android:layout_height=”80dp”
android:src=”@drawable/jacket”
/>
TextView
android:id=”@+id/gridtv_text_item”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_below=”@+id/gridiv_image_item”
android:layout_centerInParent=”true”
android:text=”test”
/>
Java文件:
三.创建Grid对象以及存放item的List以及存放应用信息类型ResolveInfo的list

private List<ResolveInfo> rilist;//应用信息类型
    private List<Map<String,Object>> list = new          ArrayList<Map<String,Object>>();
    private GridView gvmain;

四.在onCreate方法下实现init方法,init方法主要是把应用信息的list获取到,并把存放item的list填充满

 private void init(){
        Intent intent = new Intent(Intent.ACTION_MAIN,null); //应用程序最先启动的Activity 
        intent.addCategory(Intent.CATEGORY_LAUNCHER);        //应用程序是否显示在程序列表里
        rilist = getPackageManager().queryIntentActivities(intent,0); //得到应用信息列表
        for (int i = 0;i<rilist.size();i++){
            Map<String,Object> maps = new HashMap<String,Object>();
            maps.put("itemImage",rilist.get(i).activityInfo.loadIcon(getPackageManager()));
            maps.put("itemText",rilist.get(i).activityInfo.loadLabel(getPackageManager()));
            list.add(maps);
        }
    }

五.获取GridView控件,并创建SimpleAdapter,并实现simpleAdapter.setViewBinder方法(这个方法主要用于检测图片是否被设置成功)

gvmain = (GridView) findViewById(R.id.gv_mainshow);
//参数 context,Data(存放的数据一般是list<Map<String,Objcet>> String也是可以int型),要显示的格局item,要显示格局里的控件的key,要显示格局里的控件id
        SimpleAdapter simpleAdapter = new SimpleAdapter(
                this,
                list,
                R.layout.grid_item,
                new String[]{"itemImage","itemText"},
                new int[]{R.id.gridiv_image_item,R.id.gridtv_text_item});
//如果不加这个图片判断,则会显示不出来图标
        simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Object o, String s) {
                if(view instanceof ImageView && o instanceof Drawable){ //判断得到的view是否为ImageView的子类和o是否为Drawble的子类
                    ImageView iv = (ImageView) view;                    //如果是,就把图片设置上,并返回true
                    iv.setImageDrawable((Drawable) o);
                    return true;
                }

                return false;
            }
        });

六.gvmain.setAdapter(),并设置OnItemClickListener Item监听

gvmain.setAdapter(simpleAdapter);
    gvmain.setOnItemClickListener(listener);

七.创建AdapterView.OnItemClickListener 对象listener,实现其onItemClick方“`

private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            ResolveInfo info = rilist.get(i);  //得到被按下的item 应用
//get app's packageName
            String packagename = info.activityInfo.packageName;
            //get app's  Class activity
            String mainActivity = info.activityInfo.name;
//把获取到的信息封装到component里,然后使用Intent的setComponent,启动Intent
            ComponentName component = new ComponentName(packagename,mainActivity);
            Intent intent = new Intent();
            intent.setComponent(component);
            startActivity(intent);
        }
    };

效果图:这里写图片描述

2011-07-04 00:04:30 gumanren 阅读数 3749
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19663 人正在学习 去看看 任苹蜻



开发自己的android桌面,有这个想法是去年一个项目(移动公司的变态项目,需要定制android机器,将一对移动业务定制到里面去)需要定制android桌面,当初的做法是直接改原版的Launcher.apk源码,然后再Linux下编译生成Launcher.apk然后刷到固件中去.实现桌面定制,让用户无法删除.至于为什么,你懂的....
废话不多说了.我们现在要做的不是改原生的Launcher.apk,而是做个相当于普通apk能删除与安装的桌面,现在市面上有的如:91的熊猫桌面.还有其他一些在开发的就不多说了.
先什么都不说来段demo最实际,一切从最原始的兴趣驱动,有了小成就才更有动力来了解与学习launcher,需要刨根问底的同学们,自己google先.



Manager.java

package com.jaryou;

import com.nebulalauncher.R;

import android.app.Activity;
import android.os.Bundle;

public class Manager extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Launcher.java

package com.jaryou.launcher;

import com.nebulalauncher.R;

import android.app.Activity;
import android.os.Bundle;

public class Launcher extends Activity{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.launcher);
    }
}

launcher.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>
AndroidManifest.xml     (关键代码)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.nebulalauncher" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon" android:label="@string/app_name">
<!-- 作为桌面设置的Activity -->
		<activity android:name=".Manager" android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<!--  作为桌面Activity -->
		<activity android:name="com.jaryou.launcher.Launcher">
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <!-- 关键部分 开始-->
                <category android:name="android.intent.category.HOME"/> 
                <category android:name="android.intent.category.DEFAULT" />
                <!-- 关键部分 结束--> 
            </intent-filter> 
		</activity>		
	</application>
	<uses-permission android:name="android.permission.CALL_PHONE" />
	<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
	<uses-permission android:name="android.permission.GET_TASKS" />
	<uses-permission android:name="android.permission.READ_CONTACTS" />
	<uses-permission android:name="android.permission.SET_WALLPAPER" />
	<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
	<uses-permission android:name="android.permission.VIBRATE" />
	<uses-permission android:name="android.permission.WRITE_SETTINGS" />
</manifest>


新建个android的项目,将上面的代码贴进去,然后运行.

ok,然后再长按   挂机键  出现桌面选择提示

1.启动器(默认launcher)

 2. 你的应用名称 

这时候选择你的应用,会发现桌面变成了你的刚弄的这个demo了.

如果需要变回原来的launcher.只需要要长按挂机键然后松开就能换回默认桌面.

不多说了.先去体现下吧.


2017-11-27 17:22:55 qq_28380121 阅读数 260
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    19663 人正在学习 去看看 任苹蜻

     最近项目用到桌面定制,于是研究了AppWidgetProvider,话不多说,直接进入正题.

其实打开AppWidgetProvider源码我们会发现,他是继承于broadcastReceiver的广播接收器,其中会定义一个onUpdate的方法,该方法会在桌面加载或者更新的时候调用,里面定义了三个参数,分别是context,appWidgetManager和appWidgetIds,其中appWidgetsIds是桌面ID.而且此时我们需要开启一个服务,定时的更新桌面按钮触发事件.

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d(TAG, " ------ onUpdate(): appWidgetIds.length=" + appWidgetIds.length);

    // 每次 widget 被创建时,对应的将widget的id添加到set中
    for (int appWidgetId : appWidgetIds) {
        idsSet.add(Integer.valueOf(appWidgetId));
    }
    prtSet(context);

    // 解决CashierWidgetProvider没有定时刷新问题(不刷新则不会变化layout 已经按钮触发事件)
    Log.d(TAG, " ------ onUpdate(): CashierWidgetService");
    Intent intent = new Intent(context, MyWidgetService.class);
    PendingIntent refreshIntent = PendingIntent.getService(context, 0, intent, 0);
    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC, 0, 1000, refreshIntent);
    context.startService(intent);
}
在onReceive里会接收服务发来的广播,此时我们需要更新桌面,并对刷新按钮的触发事件,如果广播接收的action是Intent.CATEGORY_ALTERNATIVE
此时可根据data.getSchemeSpecificPart()做相应的点击事件
@Override
public void onReceive(Context context, Intent intent) {
    if (context == null) {
        return;
    }
    final String action = intent.getAction();
    Log.d(TAG, " ------ OnReceive:Action: " + action);
    if (ACTION_UPDATE_ALL.equals(action)) {
        // “更新”广播,当覆盖安装时:AppWidgetManager.getInstance(context)会报空指针
        updateAllAppWidgets(context, AppWidgetManager.getInstance(context), idsSet);

    } else if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
        // “按钮点击”广播
        Uri data = intent.getData();
        int clickId = Integer.parseInt(data.getSchemeSpecificPart());
        Log.d(TAG, " ------ OnReceive:clickId: " + clickId);
        switch (clickId) {
            case REQUEST_CLICK_RL0_EVENT:
                startPetApp(context, Activity_One.class);
                break;
            case REQUEST_CLICK_RL1_EVENT:
                startPetApp(context, Activity_Two.class);

                break;
            case REQUEST_CLICK_RL2_EVENT:
                startPetApp(context, Activity_One.class);
                break;
            case REQUEST_CLICK_RL3_EVENT:
                startPetApp(context, Activity_Two.class);

                break;
            case REQUEST_CLICK_RL4_EVENT:
                startPetApp(context, Activity_One.class);

                break;
            case REQUEST_CLICK_RL5_EVENT:
                startPetApp(context, Activity_Two.class);

                break;
            case REQUEST_CLICK_RL6_EVENT:
                startPetApp(context, Activity_One.class);

                break;

            default:
                break;
        }
    }

    super.onReceive(context, intent);
}
源码地址   https://github.com/kyrieLiu/petWidget1.git
运行demo方法:运行后长按桌面,点击小组件,找到桌面dmeo,把它拖到桌面上来,然后可以查看效果



没有更多推荐了,返回首页